打字稿中的 ES6 地图

新手上路,请多包涵

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

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

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

原文由 nicksrandall 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 506
2 个回答

编辑(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]number )这样的东西仍然有效。


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

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


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

当前的最佳解决方案是具有类型化键和值的对象(有时称为哈希图)。对于具有 string 类型的键和 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

原文由 zeh 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

TypeScript 没有内置的 pollyfills。如果有的话,由你决定使用哪个 pollyfill。你可以使用像 es6Collectiones6-shimscorejs ..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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题