TypeScript TS7015: Элемент неявно имеет тип "any", потому что выражение индекса не относится к типу "число",
Im получение этой ошибки компиляции в моем приложении Angular 2:
TS7015: Element implicitly has an 'any' type because index expression is not of type '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> = [];
Но кто-то сказал, что проблема пытается использовать строковый тип в качестве индекса в массиве и что я должен использовать карту. Но я не знаю, как это сделать.
Thans для вашей помощи!
Ответы
Ответ 1
Если вам нужна структура данных ключ/значение, тогда не используйте массив.
Вы можете использовать обычный объект:
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;
}
Ответ 2
Не прямая проблема OP, но для пользователей, сталкивающихся с этой ошибкой для библиотек, не находящихся под их контролем, можно устранить эту ошибку, добавив:
"suppressImplicitAnyIndexErrors": true,
в файл tsconfig.json.
Ответ 3
Я использовал это, чтобы обойти это, чтобы я мог использовать объект окна.
//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