【问题标题】:TypeScript + ES6 Map + Index signature of object type implicitly has an 'any' typeTypeScript + ES6 Map + 对象类型的索引签名隐式具有“任何”类型
【发布时间】:2016-04-07 16:15:56
【问题描述】:

我在 TypeScript 中有以下代码:

export class Config
{
    private options = new Map<string, string>();

    constructor() {
    }

    public getOption(name: string): string {
        return this.options[name]; // <-- This line causes the error.
    }
}

编译器给了我这个错误:

Error:(10, 16) TS7017: Index signature of object type implicitly has an 'any' type.

通过 es6-shim,地图是“可能的”。我不太确定这里发生了什么。其实这张地图让我有点困惑。 Map 应该来自应该实现 es6 功能的 es6-shim。但是 es6 没有静态类型,对吧?那么,为什么 Map 期望键/值类型作为通用参数呢?我看到有些人添加了“noImplicitAny”标志,但我想解决问题,而不是忽略它。

谢谢。

【问题讨论】:

    标签: typescript ecmascript-6 es6-shim


    【解决方案1】:

    从 ES6 Map 对象中检索键是通过 Map.prototype.get method 完成的,不使用数组运算符。

    因为 JavaScript 中的所有对象都是动态的并且可以添加属性,所以仍然可以将数组访问运算符与 Map 对象一起使用,但这是错误的——你实际上并没有使用 Map 功能,你是只需向实例添加任意属性。那时你也可以使用{} 而不是new Map()。 TypeScript 编译器试图告诉你这一点,警告你正在尝试使用不存在的索引签名。

    【讨论】:

    • TL;DR:使用map.get(key) 而不是map[key]。
    【解决方案2】:

    但是 es6 没有静态类型,对吧?那么,为什么 Map 期望键/值类型作为通用参数

    这些是编译时类型。类似于一个可以键入一个数组:

    let foo = new Array(); // array of any 
    let bar = new Array<string>(); // array of strings
    
    foo.push(123); // okay
    bar.push(123); // Error : not a string
    

    这两行都编译为new Array(),但其中一行确保检查成员

    此行导致错误。

    因为Map 的定义 没有指定索引签名的return 类型是类型安全的。

    快速修复:

    public getOption(name: string): string {
        return this.options[name] as string;
    }
    

    【讨论】:

    • 这个答案不正确。 Map 没有指定“安全”的索引签名的返回类型,它根本没有指定索引签名,因为 Map 对象不是那样工作的(它们有 get/set 方法)。
    【解决方案3】:

    尝试为选项创建界面。有点像,

    interface IOptions {
    
    [propName: string]: string;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 1970-01-01
      • 2017-08-02
      • 2017-05-06
      • 2019-01-06
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多