【问题标题】:Typescript interface with dynamic keys extending Object带有扩展 Object 的动态键的 Typescript 接口
【发布时间】:2018-09-04 05:59:54
【问题描述】:

在 Typescript 中,当使用索引器(键作为字符串)时,我无法让我的界面扩展对象。

如果我不扩展 Object 那么它可以正常工作,但智能感知不会为 Object.hasOwnProperty() 方法提供建议。

interface MyObject extends Object {
 [key: string] : string;
}

上面的代码,我得到编译时错误: “'(v: string) => boolean' 类型的属性 'hasOwnProperty' 不能分配给字符串索引类型 'string'。”

稍后在代码中我想使用 MyObject 类型的变量来检查它是否包含使用 Object 的 hasOwnProperty 方法的特定键。

【问题讨论】:

    标签: typescript object dynamic interface key


    【解决方案1】:

    您无需扩展 Object 即可拥有 hasOwnProperty 方法。由于所有对象都继承Object,因此该方法将存在于接口的任何实例上。

    interface MyObject {
        [key: string]: string;
    }
    
    var v: MyObject = {
        "foo" : "1"
    }
    v.hasOwnProperty("foo");
    

    索引签名一般意味着接口的所有成员都将与索引的返回类型兼容。虽然你可以使用联合类型来解决这个问题,但是如果没有Object.assign,你仍然不能直接创建这样的对象:

    type MyObject  = Object & { // Object is useless but we can specify it
        [key: string]: string;
    } & { // We can specify other incompatible properties
        required: boolean
    }
    
    // We can create an instance with `Object.assign`
    var v: MyObject = Object.assign({
        "foo" : "1"
    }, {
        required: true
    });
    v.hasOwnProperty("foo");
    console.log(v.required);
    console.log(v['bar']); 
    

    【讨论】:

    • 谢谢,这提供了非常清晰的信息。只是当我执行“v.”时,在代码中我没有在建议列表中获得 hasOwnProperty。有没有办法解决这个问题?
    • 这不起作用。您使用哪个版本的 TS 进行了测试?
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2020-08-22
    • 2020-10-30
    • 2020-06-09
    • 2016-07-06
    • 2017-10-21
    • 2020-04-09
    • 2018-06-20
    相关资源
    最近更新 更多