为什么字符串索引签名要求所有属性都匹配其返回类型?

时间:2019-10-01 13:51:11

标签: typescript

来自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必须是索引器的子类型?如果我有一个对象,其中namenumber时,除name以外的所有元素都应该为string

然后,文档说:

  

这是因为字符串索引声明obj.property也可以作为obj["property"]使用。

如果namestring而不是number,我仍然可以同时使用obj.nameobj["name"]来访问它吗?我看不出这有什么区别。

1 个答案:

答案 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'.

由于所有属性都可以通过这种方式访问​​,因此它们必须都具有相同的类型。