在Typescript中,当使用索引器时,我无法使接口扩展Object(键为字符串)。
如果我不扩展Object,那么它工作正常,但intellisense不提供Object.hasOwnProperty()方法的建议。
interface MyObject extends Object {
[key: string] : string;
}
上面的代码,我得到编译时错误: “属性'hasOwnProperty'类型'(v:string)=> boolean'不能赋予字符串索引类型'string'。”
稍后在代码中我想使用MyObject类型的变量来检查它是否包含使用Object的hasOwnProperty方法的特定键。
答案 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']);