来自the docs:
虽然字符串索引签名是描述“字典”模式的强大方法,但它们也强制所有属性都与其返回类型相匹配。
然后他们显示此界面:
interface NumberDictionary {
[index: string]: number;
length: number; // ok, length is a number
name: string; // error, the type of 'name' is not a subtype of the indexer
}
我的问题是-为什么name
必须是索引器的子类型?如果我有一个对象,其中name
为number
时,除name
以外的所有元素都应该为string
,
然后,文档说:
这是因为字符串索引声明
obj.property
也可以作为obj["property"]
使用。
如果name
是string
而不是number
,我仍然可以同时使用obj.name
和obj["name"]
来访问它吗?我看不出这有什么区别。
答案 0 :(得分:2)
我不知道这有什么不同。
因为后者,obj["name"]
至少有可能通过indexer属性。更好的例子可能是:
declare let s: string;
console.log(obj[s]);
...因为很明显我们使用的是字符串而不是字符串文字"name"
。使用索引器属性可以执行此操作,而如果没有索引器属性you get an error,则可以这样做:
interface NumberDictionary { // [index: string]: number; commented out indexer length: number; name: string; } let x: NumberDictionary = {length: 0, name: "foo"}; declare let s: string; console.log(x[s]); ^^^^ Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'NumberDictionary'.
由于所有属性都可以通过这种方式访问,因此它们必须都具有相同的类型。