我是TypeScript的新手,我不明白我需要做些什么来修复生成TS7015错误的行(使用字符串变量引用枚举成员),因为紧跟其后的行不会出错(使用字符串文字引用枚举成员):
enum State {
Happy = 0,
Sad = 1,
Drunk = 2
}
function Emote(enumKey:string) {
console.log(State[enumKey]); // error TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.
console.log(State["Happy"]); // no error
}
"noImplicitAny": true
已在项目tsconfig.json
中设置检测到错误
"noImplictAny": false
已在项目tsconfig.json
中设置,未检测到错误
我正在使用 "ntypescript": "^1.201603060104.1"
我现在正在使用"tsc": "1.8.10"
C:>npm install -g typescript
`-- typescript@1.8.10
验证安装:
C:\>tsc --version
Version 1.8.10
这是我的tsconfig.json
文件:
{
"compileOnSave": true,
"compilerOptions": {
"target": "ES5",
"module": "System",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": true,
"noImplicitAny": true,
"sourceMap": true,
"mapRoot": "map/",
"diagnostics": true
},
"exclude": [
"node_modules",
"typings"
]
}
这是编译器输出:
C:\>tsc
test.ts(8,17): error TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.
答案 0 :(得分:65)
如果您使用的是TypeScript 2.1+,则可以将enumKey
的类型更改为keyof typeof State
,如下所示:
function Emote(enumKey: keyof typeof State) {...}
或者,如果函数的输入必须是string
,则:
var state : State = State[enumKey as keyof typeof State];
说明:
生成错误是因为作为任意字符串的TypeScript不知道enumKey
是否是State
成员的名称。 TypeScript 2.1+引入了keyof
运算符,该运算符返回类型的已知公共属性名称的并集。使用keyof
允许我们声明该属性确实在目标对象中。
但是,当您创建枚举时,TypeScript实际上会生成类型(始终是number
的子类型)和值(枚举您可以在表达式中引用的对象)。当您编写keyof State
时,您实际上将获得number
的文字属性名称的并集。要获取枚举对象的属性名称,可以使用keyof typeof State
。
来源:
https://github.com/Microsoft/TypeScript/issues/13775#issuecomment-276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
答案 1 :(得分:15)
我怀疑这与TS 1.8.x在这些情况下对字符串文字的新支持有关。 TS碰巧知道" Happy"是一个有效的字符串索引,但它不知道enumKey
是否成立。您可以通过将其转换为<any>
来修复它,如下所示:
function Emote(enumKey:string) {
console.log(State[enumKey]); // error TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.
console.log(State["Melancholy"]); // error TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.
console.log(State["Happy"]); // no error
console.log(State[<any>enumKey]); // no error
console.log(State[<any>"Melancholy"]); // no error
}
(顺便说一句,我认为这是新的:我无法用1.8.9重现这个错误,但是一旦我升级到1.8.10,我就可以。)
同样有趣的是,我希望这可以在没有错误的情况下工作,但它没有:
function TypedEmote(enumKey:'Happy'|'Sad'|'Drunk'){
console.log(State[enumKey]);
}
必须要了解我不了解的TS规范,或者他们可能还没有解决这个问题。
答案 2 :(得分:4)
您可以使用编译器选项防止此错误,而不会丢失整个严格的空检查
"suppressImplicitAnyIndexErrors": true
答案 3 :(得分:2)
var stateName = "Happy"
var state = <State>parseInt(State[<any>stateName]);
这是我为使编译器满意而必须做的事情