我在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;旗帜,但我想解决问题,而不是忽视它。
谢谢。
答案 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;
}