TypeScript + ES6 Map +对象类型的索引签名隐含有一个' any'类型

时间:2016-01-04 04:12:48

标签: typescript ecmascript-6 es6-shim

我在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.

地图是可能的&#39;通过es6-shim。我不太清楚这里发生了什么。实际上这张地图让我有些困惑。 Map应该来自es6-shim,它应该实现es6功能。但是es6没有静态类型,对吗?那么,为什么Map期望键/值类型作为泛型参数?我看到有些人添加了“noImplicitAny”#39;旗帜,但我想解决问题,而不是忽视它。

谢谢。

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

尝试为选项创建界面。喜欢的东西,

interface IOptions {

[propName: string]: string;

}