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

前端 未结 4 2067
故里飘歌
故里飘歌 2020-12-09 14:40

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\'.


        
相关标签:
4条回答
  • 2020-12-09 14:53

    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;
    }
    
    0 讨论(0)
  • 2020-12-09 14:54

    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
    
    0 讨论(0)
  • 2020-12-09 15:13

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

    0 讨论(0)
  • 2020-12-09 15:16

    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.

    0 讨论(0)
提交回复
热议问题