它是什么意思`对象类型的索引签名隐含地具有'任何'类型

Max*_*kyi 9 typescript

我有下面的代码,并noImplicitAny:truetsconfig:

let o = {a: 3};

// works fine
o['a'] = 3;

// reports an error 
// Error:(4, 1) TS7017:Index signature of object type implicitly has an 'any' type.
o['b'] = 3;
Run Code Online (Sandbox Code Playgroud)

这个错误是什么意思?

这是在TypeScript游乐场 - 确保单击选项并设置noImplicitAny(似乎不记得可共享链接中的选项).

shu*_*son 16

导致该错误的原因是未明确定义索引签名.

您可以index signature明确地声明:

let ox : { [index:string] : number } = {};
ox['b'] = 3; 
Run Code Online (Sandbox Code Playgroud)

我认为原因o['a'] = 3;不是错误是因为括号符号属性访问的规则1,它在规范中的以下规则中定义:

  1. 如果index是字符串文字或数字文字,并且对象具有明显属性(第3.11.1节),其名称由该文字给出(在数字文字的情况下转换为字符串表示),属性访问属于该属性的类型.
  2. 否则,如果object具有明显的数字索引签名且索引的类型为Any,Number基本类型或枚举类型,则属性访问属于该索引签名的类型.
  3. 否则,如果object具有明显的字符串索引签名且索引的类型为Any,String或Number原始类型或枚举类型,则属性访问属于该索引签名的类型.
  4. 否则,如果index的类型为Any,String或Number基元类型或枚举类型,则属性访问的类型为Any.
  5. 否则,属性访问无效并发生编译时错误.