打字稿中的ES6地图

nic*_*all 134 javascript typescript typescript1.5

我正在使用类似脚本创建一个类,该类具有ES6(ECMAscript 2016)Map的属性,如下所示:

class Item {
  configs: ????;
  constructor () {
    this.configs = new Map();
  }
}
Run Code Online (Sandbox Code Playgroud)

如何在打字稿中声明ES6 Map类型?

zeh*_*zeh 189

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

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


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

当前最佳解决方案是具有键入键和值的对象(有时称为散列映射).对于具有类型键和类型Map值的对象Record:

type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
    "a": { name: "joe" },
    "b": { name: "bart" },
};
Run Code Online (Sandbox Code Playgroud)

然而,一些警告:

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

通过上面的例子:

var arr : { [key:string]:number; } = {};
Run Code Online (Sandbox Code Playgroud)

  • 那么如何迭代地图中的属性?当我做arr.values()时,我得到"属性'值'在类型上不存在......" (3认同)

moh*_*azy 122

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

TypeScript没有内置的pollyfill.由您来决定使用哪种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;
Run Code Online (Sandbox Code Playgroud)

  • 在针对ES5时,即使使用polyfill,也无法使用某些功能 - 请参阅https://github.com/Microsoft/TypeScript/issues/6842 (2认同)

Arn*_*aud 49

这是一个例子:

this.configs = new Map<string, string>();
this.configs.set("key", "value");
Run Code Online (Sandbox Code Playgroud)

演示

  • 错误TS2304:找不到名称“地图”。 (3认同)

小智 23

是地图现在可用于打字稿..如果查看lib.es6.d.ts,您将看到界面:

interface Map<K, V> {
  clear(): void;
  delete(key: K): boolean;
  forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void,thisArg?: any): void;
  get(key: K): V | undefined;
  has(key: K): boolean;
  set(key: K, value: V): this;
  readonly size: number;} 
Run Code Online (Sandbox Code Playgroud)

它非常适合用作字符串,对象的字典..唯一令人烦恼的是,如果你使用它在Map.get(key)的其他地方赋值,那么像Code这样的IDE会给你带来关于可能未定义的问题..而不是使用is-defined check创建变量..简单地转换类型(假设您确定地图具有键值对)

class myclass {
   mymap:Map<string,object>
   ...
   mymap = new Map<string,object>()
   mymap.set("akey",AnObject)
   let objectref = <AnObject>mymap.get("akey")
Run Code Online (Sandbox Code Playgroud)


bas*_*rat 12

如何在打字稿中声明ES6 Map类型?

你需要瞄准目标--module es6.这是不幸的,你可以在这里提出你的担忧:https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111


Jon*_*nga 6

不确定这是否是官方的,但这在打字稿 2.7.1 中对我有用:

class Item {
   configs: Map<string, string>;
   constructor () {
     this.configs = new Map();
   }
}
Run Code Online (Sandbox Code Playgroud)

简单来说 Map<keyType, valueType>