打字稿"不是索引器的子类型",它是什么意思?

时间:2016-09-20 16:44:06

标签: typescript

我正在通过阅读有关索引器类型的this official document来学习Typescript。

我无法理解这段代码:

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
}

首先,为什么要把长度'内部索引类型???

let myDict : NumberDictionary;
myDict[10] = 23;

NumberDictionary是一种索引类型。为什么NumberDictionary定义中有一个长度?索引类型应该是[10],为什么有长度? javascript中的数组对象有长度,但索引类型是数组吗?如果是这样,为什么上面的例子定义了一个长度?有必要吗? 对不起我的咆哮。你可以看到我很困惑。

其次,

name: string;// error, the type of 'name' is not a subtype of the indexer

我不理解这条线上的评论。为什么name必须是索引器的子类型?索引器就像[10] =" Tom",那么索引器的子类型是什么?

2 个答案:

答案 0 :(得分:2)

  

我不理解这条线上的评论。为什么name必须是索引器的子类型?

因为任何string访问,TypeScript都会假定类型number(基于[index: string]: number;)。因此,如果允许name: string;,则以下内容将为number,但您可能认为 string

let x: NamedDictionary = Object.create(null);
let n = "name";
let y = x[n]; // TypeScript assumes `number`
let z = x["name"]; // Would you want `string`?

查看yz ^

之间的不一致

答案 1 :(得分:0)

回答第一个问题,NumberDictionary 是一个对象接口。它不是数组接口。索引签名引用对象内的任何索引。

NumberDictionary 对象有两个强制值 body, html { overflow-x:hidden; } length。它可以有额外的属性,前提是它匹配索引签名(索引和值类型)。

界面

name

索引签名

    interface NumberDictionary {
        [index: string]: number | string;
        length: number;
        name: string;
    }
    
    let nd: NumberDictionary = { length: 10, name: "Ten", lang: "en" };

这意味着我可以为我的对象设置一个额外的 [index: string]: number | string; 而不会出现类型错误

如果你知道 lang: string 在我的对象中必须是可选的,你必须在我的界面中设置它

lang:string