我正在通过阅读有关索引器类型的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",那么索引器的子类型是什么?
答案 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`?
查看y
和z
^
答案 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