TypeScript TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'

JavascriptAngularTypescript

Javascript Problem Overview


Im getting this compilation error in my Angular 2 app:

>TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.

The piece of code causing it is:

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

This however doesn't cause this error:

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

This doesn't make any sense to me. I would like to solve it when defining the attributes the first time. At the moment I'm writing:

private applicationsByState: Array<any> = [];

But someone mentioned that the problem is trying to use a string type as index in an array and that I should use a map. But I'm not sure how to do that.

Thans for your help!

Javascript Solutions


Solution 1 - Javascript

If you want a key/value data structure then don't use an array.

You can use a regular object:

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

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

Or you can use a Map:

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

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

Solution 2 - Javascript

Not the OP's direct issue but for users encountering this error for libraries not under their control, one can suppress this error is by adding:

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

to the tsconfig.json file.

Solution 3 - Javascript

I used this to get around it so I could use the window object.

//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

Solution 4 - Javascript

I was actually working with React and I got this error when I assigned an object's property through a custom key (i.e. myObj[myKey] = ). To resolve it, I simply used as keyof: 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!';

This explicitly tells Typescript that your custom string (myKey) belongs to the group of properties from an interface/type you used for declaring your object (myObj).

P.S.: another way to get the property's value is shown on a closed Typescript's issue on Github through extends:

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));

Solution 5 - Javascript

In tsconfig.json

 compilerOptions:{

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

 }

Solution 6 - Javascript

My function :

My function:

`data={
oldkey1: 24,
oldkey2: "word",
oldkey3: true,
}

object = {
oldkey1: "newkey1",
oldkey2: "newkey2",
oldkey3: "newkey3",
}

const updateKeys = (data: object, object:objectType): object => {

  let dataStr = JSON.stringify(data)
  Object.keys(data).forEach((key) => {
    dataStr = dataStr.replace(key, object[key])
  })

  let newData = JSON.parse(dataStr)

  return newData;
};`

Thank you

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionOle SpaarmannView Question on Stackoverflow
Solution 1 - JavascriptNitzan TomerView Answer on Stackoverflow
Solution 2 - JavascriptRobert BrisitaView Answer on Stackoverflow
Solution 3 - JavascriptDave ت MaherView Answer on Stackoverflow
Solution 4 - JavascriptCPHPythonView Answer on Stackoverflow
Solution 5 - Javascriptrohit.khurmi095View Answer on Stackoverflow
Solution 6 - JavascriptmeguehoutView Answer on Stackoverflow