我正在 typescript 中创建一个类,它的属性是 ES6 (ECMAscript 2016) Map,如下所示:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
如何在 typescript 中声明 ES6 Map 类型?
原文由 nicksrandall 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在 typescript 中创建一个类,它的属性是 ES6 (ECMAscript 2016) Map,如下所示:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
如何在 typescript 中声明 ES6 Map 类型?
原文由 nicksrandall 发布,翻译遵循 CC BY-SA 4.0 许可协议
请参阅评论: https ://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScript 没有内置的 pollyfills。如果有的话,由你决定使用哪个 pollyfill。你可以使用像 es6Collection , es6-shims , corejs ..etc 这样的东西。 Typescript 编译器所需要的只是您要使用的 ES6 结构的声明。你可以在 这个 lib 文件 中找到它们。
这是相关部分:
interface Map<K, V> { clear(): void; delete(key: K): boolean; entries(): IterableIterator<[K, V]>; forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void; get(key: K): V; has(key: K): boolean; keys(): IterableIterator<K>; set(key: K, value?: V): Map<K, V>; size: number; values(): IterableIterator<V>; [Symbol.iterator]():IterableIterator<[K,V]>; [Symbol.toStringTag]: string; } interface MapConstructor { new <K, V>(): Map<K, V>; new <K, V>(iterable: Iterable<[K, V]>): Map<K, V>; prototype: Map<any, any>; } declare var Map: MapConstructor;
原文由 mohamed hegazy 发布,翻译遵循 CC BY-SA 3.0 许可协议
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
编辑(2019 年 6 月 5 日): 虽然“TypeScript 原生支持
Map
”的想法仍然正确,因为 2.1 版 TypeScript 支持称为Record
的东西。不幸的是,第一个通用参数(键类型)仍然没有被完全尊重:即使是
string
类型,像peopleA[0]
(number
)这样的东西仍然有效。编辑(2016 年 4 月 25 日): 下面的答案是旧的,不应被视为最佳答案。 TypeScript 现在确实“原生地”支持 Maps,因此它只允许在输出为 ES6 时使用 ES6 Maps。对于 ES5,它不提供 polyfill;你需要自己嵌入它们。
有关更多信息,请参阅 下面的 mohamed hegazy 的答案 以获得更现代的答案,或者甚至参考 此 reddit 评论 以获得简短版本。
从 1.5.0 beta 开始,TypeScript 还不支持 Maps 。它也不是 路线图 的一部分。
当前的最佳解决方案是具有类型化键和值的对象(有时称为哈希图)。对于具有
string
类型的键和number
类型的值的对象:然而,一些警告:
键只能是
string
或number
类型实际上,您使用什么作为键类型并不重要,因为数字/字符串仍然可以互换接受(仅强制执行值)。
用上面的例子: