我在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
(似乎不记得可共享链接中的选项)。
答案 0 :(得分:15)
导致错误是因为未明确定义index signature。
您可以明确地声明index signature
:
let ox : { [index:string] : number } = {};
ox['b'] = 3;
o['a'] = 3;
没有错误的原因是因为括号表示法属性访问的规则1,它在以下rules from the spec中定义:
- 如果index是字符串文字或数字文字,并且对象具有明显属性(第3.11.1节),其名称由该文字给出(在数字文字的情况下转换为字符串表示),属性访问权限属于那种财产的类型。
- 否则,如果object具有明显的数字索引签名且索引的类型为Any,Number基本类型或枚举类型,则属性访问权属于该索引签名的类型。
- 否则,如果object具有明显的字符串索引签名且索引的类型为Any,String或Number原始类型或枚举类型,则属性访问权属于该索引签名的类型。
- 否则,如果index的类型为Any,String或Number基元类型或枚举类型,则属性访问的类型为Any。
- 否则,属性访问无效,并发生编译时错误。
醇>