我正在关注Microsoft Typescript手册,并在indexable types chapter我正在摆弄代码以更好地理解它。我最终得到了这段代码,不知道为什么它不会返回错误:
interface NumberDictionary {
[index: number]: number;
length: number;
name: number;
}
// 'x' is not a number, 's' is not a number
let foo: NumberDictionary = { x: 's', length: 2, name: 3 };
但是,当我删除界面中的第一行时,它会抛出x不在界面中的错误。
答案 0 :(得分:1)
那是因为通过声明索引类型,你会说出以下内容:"具体的实现将确保你可以scalastyleSources
并获得obj[42]
"
其他属性不属于那种类型并不重要。
通过该声明,number
和length
必须为数字,但不会检查其他数字。
事实上,我会说你的代码片段中最令人惊讶的事情是name
是允许的。
如果没有索引声明,x
的结构就像我们期望的那样正确执行,并且foo
是不允许的。有了索引,它似乎没有抱怨。奇
我的猜测是添加索引接口放宽类型检查以适应双重语法x
和obj["bar"]
,这当然不会直接用于你的obj.bar
索引,但TS实际上会将其转换为引擎盖下的字符串:
这是因为在使用数字进行索引时,JavaScript实际上会在索引到对象之前将其转换为字符串。这意味着使用100(数字)索引与使用" 100"进行索引相同。 (一个字符串)
(来自问题中链接的TS手册)
因此编译器可能为number
之类的索引访问调用做好准备,如果foo["anything"]
的值包含未声明的foo
密钥,它就不会抱怨。