我正在 typescript 中创建一个类,它的属性是 ES6 (ECMAscript 2016) Map,如下所示:
class Item { configs: ????; constructor () { this.configs = new Map(); } }
如何在 typescript 中声明 ES6 Map 类型?
编辑(2019 年 6 月 5 日): 虽然“TypeScript 原生支持”的想法Map仍然正确,因为 2.1 版 TypeScript 支持名为Record.
Map
Record
type MyMapLikeType = Record<string, IPerson>; const peopleA: MyMapLikeType = { "a": { name: "joe" }, "b": { name: "bart" }, };
不幸的是,第一个泛型参数(键类型)仍然没有被完全尊重:即使有一个string类型,像peopleA[0](a number) 这样的东西仍然有效。
string
peopleA[0]
number
编辑(2016 年 4 月 25 日): 下面的答案是旧的,不应被视为最佳答案。TypeScript 现在确实“原生地”支持 Maps,因此它只允许在输出为 ES6 时使用 ES6 Maps。对于 ES5,它不提供 polyfill;你需要自己嵌入它们。
有关更多信息,请参阅下面 mohamed hegazy的答案以获得更现代的答案,或者甚至参考此 reddit 评论以获得简短版本。
见评论:https ://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScript 没有内置 pollyfills。如果有的话,由你决定使用哪个 pollyfill。你可以使用类似 es6Collection、 es6-shims、 corejs ..etc 的东西。Typescript 编译器所需要的只是一个你想要使用的 ES6 结构的声明。你可以在这个 lib 文件中找到它们。 这是相关部分: ```js interface Map { clear(): void; delete(key: K): boolean; entries(): IterableIterator<[K, V]>; forEach(callbackfn: (value: V, index: K, map: Map) => void, thisArg?: any): void; get(key: K): V; has(key: K): boolean; keys(): IterableIterator; set(key: K, value?: V): Map; size: number; values(): IterableIterator; Symbol.iterator:IterableIterator<[K,V]>; [Symbol.toStringTag]: string; } interface MapConstructor { new (): Map; new (iterable: Iterable<[K, V]>): Map; prototype: Map; } declare var Map: MapConstructor; ```
TypeScript 没有内置 pollyfills。如果有的话,由你决定使用哪个 pollyfill。你可以使用类似 es6Collection、 es6-shims、 corejs ..etc 的东西。Typescript 编译器所需要的只是一个你想要使用的 ES6 结构的声明。你可以在这个 lib 文件中找到它们。
这是相关部分:
```js interface Map { clear(): void; delete(key: K): boolean; entries(): IterableIterator<[K, V]>; forEach(callbackfn: (value: V, index: K, map: Map) => void, thisArg?: any): void; get(key: K): V; has(key: K): boolean; keys(): IterableIterator; set(key: K, value?: V): Map; size: number; values(): IterableIterator; Symbol.iterator:IterableIterator<[K,V]>; [Symbol.toStringTag]: string; }
interface MapConstructor { new (): Map; new (iterable: Iterable<[K, V]>): Map; prototype: Map; } declare var Map: MapConstructor; ```
从 1.5.0 beta 开始,TypeScript 还不支持Maps。它也不是路线图的一部分。
当前的最佳解决方案是具有类型化键和值的对象(有时称为哈希图)。对于具有 type 键和 typestring值的对象number:
var arr : { [key:string]:number; } = {};
然而,一些警告:
用上面的例子:
// OK: arr["name"] = 1; // String key is fine arr[0] = 0; // Number key is fine too // Not OK: arr[{ a: "a" }] = 2; // Invalid key arr[3] = "name"; // Invalid value