ES6 Map in Typescript

2022-08-30 00:24:09

我正在 typescript 中创建一个类,该类具有 ES6 (ECMAscript 2016) 映射的属性,如下所示:

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

如何在打字脚本中声明 ES6 映射类型?


答案 1

编辑(2019年6月5日):虽然“TypeScript原生支持”的想法仍然是正确的,因为2.1版TypeScript支持一种叫做Record的东西Map

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

不幸的是,第一个泛型参数(键类型)仍然没有得到充分尊重:即使使用类型,像(a)这样的东西仍然有效。stringpeopleA[0]number


编辑(2016年4月25日):下面的答案是旧的,不应该被认为是最好的答案。TypeScript现在确实“原生”支持Maps,因此它只是允许在输出为ES6时使用ES6 Maps。对于ES5,它不提供多边形填充;您需要自己嵌入它们。

有关更多信息,请参阅下面的mohamed hegazy的答案以获取更现代的答案,甚至是此reddit评论以获取简短版本。


从1.5.0测试版开始,TypeScript还不支持Maps。它也不是路线图的一部分。

当前的最佳解决方案是具有类型化键和值的对象(有时称为哈希映射)。对于具有 类型键和类型值的对象:stringnumber

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

答案 2

请参阅评论:https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139

TypeScript没有内置的polryfills。由您决定使用哪个 pollyfill(如果有)。你可以使用像es6Collectiones6-shimscorejs这样的东西。等。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;