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