使用动态键扩展Object的Typescript接口

时间:2018-03-26 06:55:44

标签: typescript object dynamic interface key

在Typescript中,当使用索引器时,我无法使接口扩展Object(键为字符串)。

如果我不扩展Object,那么它工作正常,但intellisense不提供Object.hasOwnProperty()方法的建议。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

var v: MyObject = {
    "foo" : "1"
}
v.hasOwnProperty("foo");

索引签名通常意味着接口的所有成员都将与索引的返回类型兼容。你可以使用union类型解决这个问题,但是你仍然不能在没有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']);