为什么类型检查器不会使用此可索引类型返回错误?

时间:2016-06-01 16:33:00

标签: typescript

我正在关注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不在界面中的错误。

1 个答案:

答案 0 :(得分:1)

那是因为通过声明索引类型,你会说出以下内容:"具体的实现将确保你可以scalastyleSources并获得obj[42] "

其他属性不属于那种类型并不重要。

通过该声明,numberlength 必须为数字,但不会检查其他数字。 事实上,我会说你的代码片段中最令人惊讶的事情是name是允许的。 如果没有索引声明,x的结构就像我们期望的那样正确执行,并且foo是不允许的。有了索引,它似乎没有抱怨。奇

我的猜测是添加索引接口放宽类型检查以适应双重语法xobj["bar"],这当然不会直接用于你的obj.bar索引,但TS实际上会将其转换为引擎盖下的字符串:

  

这是因为在使用数字进行索引时,JavaScript实际上会在索引到对象之前将其转换为字符串。这意味着使用100(数字)索引与使用" 100"进行索引相同。 (一个字符串)

     

(来自问题中链接的TS手册)

因此编译器可能为number之类的索引访问调用做好准备,如果foo["anything"]的值包含未声明的foo密钥,它就不会抱怨。