【问题标题】:TypeScript TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'TypeScript TS7015:元素隐式具有“任何”类型,因为索引表达式不是“数字”类型
【发布时间】:2017-03-14 11:53:41
【问题描述】:

我在 Angular 2 应用程序中遇到此编译错误:

TS7015:元素隐式具有“任意”类型,因为索引表达式不是“数字”类型。

导致它的代码是:

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> = [];

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

感谢您的帮助!

【问题讨论】:

  • 如果你想定义一个字典(带有字符串键),使用类型{[key: string]: any}
  • 现在我在尝试使用this.availableStates.size 获取元素数量时得到TS2339: Property 'size' does not exist on type '{ [key: string]: any; }'.

标签: javascript angular typescript


【解决方案1】:

在 tsconfig.json 中

 compilerOptions:{

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

 }

【讨论】:

  • 仅更改tsconfig.json 设置并不是真正的答案。也许是评论。可以操纵这些设置来消除任何/所有 TS 错误。
【解决方案2】:

我实际上是在使用 React,当我通过自定义键(即myObj[myKey] = )分配对象的属性时出现此错误。为了解决它,我简单地使用了 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!';

这明确告诉 Typescript 您的自定义字符串 (myKey) 属于您用于声明对象 (myObj) 的接口/类型的属性组。

P.S.:另一种获取属性值的方法显示在封闭的Typescript's issue on Github 通过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));

【讨论】:

    【解决方案3】:

    不是 OP 的直接问题,但对于在不受其控制的库中遇到此错误的用户,可以通过添加以下内容来抑制此错误:

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

    tsconfig.json 文件。

    【讨论】:

    • 投反对票但没有解释?这有助于访问不受开发人员控制的字典对象。
    • 您错过了使用“不受您控制”的库的意义。我仍然坚持我原来的评论;因为主题是用户将看到和搜索的错误,无论 OP 的描述如何。
    • OP 没有询问不受他们控制的库,您也没有在回答中提到它。如果您曾说过“在您的情况下,您不应该这样做,但是对于其他人在代码中存在此错误且不受您控制的情况,那么您可以按如下方式抑制错误......”,那么就会有很好,得到了我的支持。
    • "noImplicitAny": false, from stackoverflow.com/a/51008097/470749 对我也有帮助。
    【解决方案4】:

    我用它来绕过它,所以我可以使用窗口对象。

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

    【讨论】:

    • Window 永远不应该用作解决方法。这与使用全局变量相同。非常不鼓励的不良做法会导致比它解决的问题更多的长期问题。
    【解决方案5】:

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

    您可以使用常规对象:

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

    或者你可以使用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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 2018-04-25
      • 2023-04-01
      • 2021-08-01
      • 2016-07-23
      • 2023-02-15
      • 2020-11-13
      • 2019-12-17
      相关资源
      最近更新 更多