TypeScript TS7015: Element 隐式具有“ any”类型,因为索引表达式的类型不是“ number”类型

我在我的 Angular 2应用程序中得到了这个编译错误:

TS7015: 元素隐式具有“ any”类型,因为索引表达式的类型不是“ number”。

造成这种情况的代码是:

getApplicationCount(state:string) {
return this.applicationsByState[state] ? this.applicationsByState[state].length : 0;
}

然而,这并不会导致这个错误:

getApplicationCount(state:string) {
return this.applicationsByState[<any>state] ? this.applicationsByState[<any>state].length : 0;
}

这对我来说毫无意义。我想在第一次定义属性时解决这个问题。现在我在写:

private applicationsByState: Array<any> = [];

但有人提到,问题在于试图使用字符串类型作为数组中的索引,我应该使用映射。但我不知道该怎么做。

谢谢你的帮助!

229499 次浏览

如果您想要一个键/值数据结构,那么不要使用数组。

你可以使用一个常规对象:

private applicationsByState: { [key: string]: any[] } = {};


getApplicationCount(state: string) {
return this.applicationsByState[state] ? this.applicationsByState[state].length : 0;
}

或者你可以使用 地图:

private applicationsByState: Map<string, any[]> = new Map<string, any[]>();


getApplicationCount(state: string) {
return this.applicationsByState.has(state) ? this.applicationsByState.get(state).length : 0;
}

不是 OP 的直接问题,而是用户在不受他们控制的库中遇到这个错误时,可以通过添加以下内容来抑制这个错误:

{
...
"suppressImplicitAnyIndexErrors": true,
...
}

tsconfig.json文件。

我使用这个来绕过它,这样我就可以使用窗口对象。

//in js code somewhere
window.DataManager = "My Data Manager";




//in strict typescript file
let test = (window as { [key: string]: any })["DataManager"] as string;
console.log(test); //output= My Data Manager

我实际上使用的是 做出反应,当我通过一个自定义键(即 myObj[myKey] = )分配一个对象的属性时,我得到了这个错误。为了解决这个问题,我简单地使用了 正如:

interface IMyObj { title: string; content: string; }
const myObj: IMyObj = { title: 'Hi', content: 'Hope all is well' };
const myKey: string = 'content';


myObj[myKey as keyof IMyObj] = 'All is great now!';

这显式地告诉 Type 脚本,您的自定义字符串(我的钥匙)属于来自用于声明对象(我的奥比)的接口/类型的属性组。

附注: 另一种获得物业价值的方法是在一个封闭的 Github 上的打字稿问题上通过 延伸显示:

interface IMyObj {
title: string;
content: string;
}


const myObj: IMyObj = { title: 'Hi', content: 'Hope all is well' };
const myKey: string = 'content';


const getKeyValue = <T extends object, U extends keyof T>(obj: T) => (key: U) =>
obj[key];
console.log(getKeyValue(myObj)(myKey));

在 tsconfig.json 中

 compilerOptions:{


"suppressImplicitAnyIndexErrors": true,
"strictNullChecks":false,
"strictPropertyInitialization": false,


}