它是什么意思`对象类型的索引签名隐式具有“任何”类型。

时间:2017-01-27 07:48:34

标签: typescript

我在noImplicitAny:true中有以下代码和tsconfig

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;

这个错误是什么意思?

Here it is on the TypeScript playground - 请务必点击选项并设置noImplicitAny(似乎不记得可共享链接中的选项)。

1 个答案:

答案 0 :(得分:15)

导致错误是因为未明确定义index signature

您可以明确地声明index signature

let ox : { [index:string] : number } = {};
ox['b'] = 3; 

o['a'] = 3;没有错误的原因是因为括号表示法属性访问的规则1,它在以下rules from the spec中定义:

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