我在typescript中创建了一个类,它的属性是ES6 (ECMAscript 2016) Map,如下所示:
class Item { configs: ????; constructor () { this.configs = new Map(); } }
我如何在typescript中声明一个ES6 Map类型?
Typescript还不支持Map。
Map
< a href = " https://kangax.github。io/compat-table/es6/#typescript" rel="nofollow noreferrer"> es6兼容性表 . io/compat-table/es6/#typescript" rel="nofollow noreferrer
编辑(2019年6月5日):而“TypeScript本身支持Map”的想法;仍然是正确的,因为版本2.1 TypeScript支持Record。
Record
type MyMapLikeType = Record<string, IPerson>; const peopleA: MyMapLikeType = { "a": { name: "joe" }, "b": { name: "bart" }, };
不幸的是,第一个泛型参数(键类型)仍然没有完全得到尊重:即使是string类型,像peopleA[0] (number)这样的参数仍然有效。
string
peopleA[0]
number
下面的答案是旧的,不应该被认为是最好的答案。TypeScript不支持Maps "所以当输出是ES6时,它只允许使用ES6 map。对于ES5,它不提供腻子;你需要自己嵌入它们。
有关更多信息,请参阅下面是Mohamed hegazy的回答以获得更现代的答案,甚至reddit评论以获得简短的版本。
在1.5.0 beta版,TypeScript还不支持地图。它也不是路线图的一部分。
目前的最佳解决方案是一个具有类型化键和值的对象(有时称为hashmap)。对于键类型为string,值类型为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
你需要以--module es6为目标。这是不幸的,你可以在这里提出你的担忧:https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
--module es6
参见:https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139中的注释
TypeScript没有自带的填充。这取决于你 决定使用哪种填充物,如果有的话。你可以用 es6Collection, es6-shims, corejs . .等。所有的Typescript 编译器需要的是你想要的ES6结构的声明 使用。你可以在this lib中找到它们 文件< / > . < / p > 以下是相关部分: 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;
以下是相关部分:
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;
最起码:
tsconfig:
"lib": [ "es2015" ]
如果你想要IE <11支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
这里有一个例子:
this.configs = new Map<string, string>(); this.configs.set("key", "value");
Demo
在tsconfig.json文件中添加"target": "ESNEXT"属性。
tsconfig.json
"target": "ESNEXT"
{ "compilerOptions": { "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ } }
不确定这是否是官方的,但这在typescript 2.7.1中为我工作:
class Item { configs: Map<string, string>; constructor () { this.configs = new Map(); } }
在简单的Map<keyType, valueType>
Map<keyType, valueType>
是地图现在可在typescript..如果你查看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;}
它伟大的使用作为一个字典的字符串,对象对..唯一的烦恼是,如果你用它在Map.get(关键)的其他地方赋值,IDE像Code给你的问题可能是未定义的..而不是创建一个变量的定义检查..简单地转换类型(假设您确定映射具有键-值对)
class myclass { mymap:Map<string,object> ... mymap = new Map<string,object>() mymap.set("akey",AnObject) let objectref = <AnObject>mymap.get("akey")
有了库配置选项,你就可以在你的项目中选择Map。只需将es2015.collection添加到你的lib部分。当你没有lib配置时,添加一个带有默认值的库,并添加es2015.collection。
es2015.collection
所以当你有target: es5时,改变tsconfig。json:
"target": "es5", "lib": [ "dom", "es5", "scripthost", "es2015.collection" ],