小编典典

打字稿中的 ES6 地图

all

我正在 typescript 中创建一个类,它的属性是 ES6 (ECMAscript 2016) Map,如下所示:

class Item {
  configs: ????;
  constructor () {
    this.configs = new Map();
  }
}

如何在 typescript 中声明 ES6 Map 类型?


阅读 77

收藏
2022-05-18

共1个答案

小编典典

编辑(2019 年 6 月 5 日): 虽然“TypeScript 原生支持”的想法Map仍然正确,因为 2.1 版 TypeScript
支持名为Record.

type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
    "a": { name: "joe" },
    "b": { name: "bart" },
};

不幸的是,第一个泛型参数(键类型)仍然没有被完全尊重:即使有一个string类型,像peopleA[0](a 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。你可以使用类似 es6Collectiones6-shimscorejs ..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; } = {};

然而,一些警告:

  1. 键只能是类型stringnumber
  2. 实际上,您使用什么作为键类型并不重要,因为数字/字符串仍然可以互换接受(仅强制执行值)。

用上面的例子:

// 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
2022-05-18