16

我在 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”标志,但我想解决这个问题,而不是忽略它。

谢谢你。

4

3 回答 3

20

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

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

于 2016-01-04T14:55:42.827 回答
3

但是 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()但其中之一确保检查成员

此行导致错误。

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

快速解决:

public getOption(name: string): string {
    return this.options[name] as string;
}
于 2016-01-04T04:27:47.523 回答
-1

尝试为选项创建界面。就像是,

interface IOptions {

[propName: string]: string;

}
于 2016-09-30T13:28:08.373 回答