我在typescript中创建了一个类,它的属性是ES6 (ECMAscript 2016) Map,如下所示:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
我如何在typescript中声明一个ES6 Map类型?
我在typescript中创建了一个类,它的属性是ES6 (ECMAscript 2016) Map,如下所示:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
我如何在typescript中声明一个ES6 Map类型?
当前回答
在tsconfig中添加"target": "ESNEXT"属性。json文件。
{
"compilerOptions": {
"target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
}
}
其他回答
EDIT(2019年6月5日):虽然“TypeScript原生支持Map”的想法仍然是正确的,因为版本2.1 TypeScript支持一种叫做Record的东西。
type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
"a": { name: "joe" },
"b": { name: "bart" },
};
不幸的是,第一个泛型参数(键类型)仍然没有完全得到尊重:即使是字符串类型,像peopleA[0](一个数字)这样的参数仍然有效。
编辑(2016年4月25日):下面的答案是旧的,不应该被认为是最好的答案。TypeScript现在“原生”支持map,所以它只允许在输出为ES6时使用ES6 map。对于ES5,它不提供腻子;你需要自己嵌入它们。
要了解更多信息,请参考下面mohamed hegazy的回答,以获得更现代的答案,或者甚至是reddit上的简短评论。
从1.5.0 beta版开始,TypeScript还不支持map。这也不是路线图的一部分。
目前的最佳解决方案是一个具有类型化键和值的对象(有时称为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
Typescript还不支持Map。
ES6兼容性表
见评论:https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScript does not come with built in pollyfills. it is up to you to decide which pollyfill to use, if any. you can use something like es6Collection, es6-shims, corejs..etc. All the Typescript compiler needs is a declaration for the ES6 constructs you want to use. you can find them all in this lib file. here is the relevant portion: 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;
不确定这是否是官方的,但这在typescript 2.7.1中为我工作:
class Item {
configs: Map<string, string>;
constructor () {
this.configs = new Map();
}
}
在简单的Map<keyType, valueType>
使用库配置选项,您可以樱桃选择映射到您的项目。只需添加es2015。集合到您的lib部分。当你没有库配置时,添加一个默认库,并添加es2015.collection。
所以当你有target: es5时,改变tsconfig。json:
"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],