Typescript 为什么字符串索引签名强制所有属性都与其返回类型匹配?
发件人: 虽然字符串索引签名是描述“dictionary”模式的一种强大方式,但它们还强制要求所有属性与其返回类型匹配 然后显示此界面:Typescript 为什么字符串索引签名强制所有属性都与其返回类型匹配?,typescript,Typescript,发件人: 虽然字符串索引签名是描述“dictionary”模式的一种强大方式,但它们还强制要求所有属性与其返回类型匹配 然后显示此界面: interface NumberDictionary { [index: string]: number; length: number; // ok, length is a number name: string; // error, the type of 'name' is not a subtype of th
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
必须是索引器的子类型?如果我有一个对象,其中除了名称
之外的所有内容都应该是数字
,而名称
是字符串
,该怎么办
然后,文件说:
这是因为字符串索引声明obj.property
也可以作为obj[“property”]
使用
如果name
是string
而不是number
,我仍然可以使用obj.name
和obj[“name”]
访问它?我看不出这有什么不同
我看不出这有什么不同
因为后者,obj[“name”]
通过indexer属性,至少可能是这样。更好的例子可能是:
declare let s: string;
console.log(obj[s]);
…很明显,我们使用的是字符串,而不是字符串文字“name”
。Indexer属性允许您执行此操作,而如果您执行此操作,则没有Indexer属性:
由于所有属性都可以通过这种方式访问,因此它们必须具有相同的类型。我明白了。这是一种类型脚本限制,因为类型是在编译时检查的,而
s
的值未知,因此元素的类型也未知。如果文档将obj.property
与obj[someValue]
进行比较,而不是将obj[“property”]
进行比较,我认为这会更容易理解,因为typescript实际上可以读取后者,并在编译时知道元素的类型(因为它的键是字符串文本,而不是未知值)。是吗?@HristiyanDodov-我同意,是的。毕竟,如果使用字符串文字,则不需要索引器。
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'.