Карта ES6 в машинописном тексте
Я создаю класс в typescript, который имеет свойство, которое является картой ES6 (ECMAscript 2016) следующим образом:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
как объявить тип карты ES6 в typescript?
10 ответов:
EDIT (Apr 25 2016): ответ ниже старый и не должен считаться лучшим ответом. TypeScript теперь поддерживает карты "изначально", поэтому он просто позволяет использовать карты ES6, когда выход ES6. Для ES5 он не предоставляет полифилл; вам нужно встроить их самостоятельно.
для получения дополнительной информации см. ответ Мохаммеда Хегази ниже для более современного ответа, или даже это reddit комментарий на короткое версия.
по состоянию на 1.5.0 бета, TypeScript еще не поддерживает карты. Это еще не часть план, либо.
текущее лучшее решение-это объект с типизированным ключом и значением (иногда называемый hashmap). Для объекта с ключами типа
string
, и значения типаnumber
:некоторые предостережения:var arr : { [key:string]:number; } = {};
- ключи могут быть только типа
string
илиnumber
- It на самом деле не имеет значения, что вы используете в качестве типа ключа, так как числа/строки по-прежнему принимаются взаимозаменяемо (применяется только значение).
С приведенным выше примером:
// 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
см. комментарий в: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
машинопись не будут приходить с построенный в pollyfills. это зависит от вас, чтобы решите, какой pollyfill использовать, если таковые имеются. вы можете использовать что-то вроде es6Collection, es6-shims, corejs..так далее. Весь машинописный текст потребности компилятора-это объявление для конструкций 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;
как объявить тип карты ES6 в typescript?
вы должны нацелиться
--module es6
. Это несчастье, и вы можете поднять свою озабоченность здесь:https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
как минимум:
tsconfig:
"lib": [ "es2015" ]
и установите полифилл, такой как https://github.com/zloirock/core-js Если вы хотите IE https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
да КАрта теперь доступна в typescript.. если вы посмотрите в lib.ЕС6.д.ТС, вы увидите интерфейс:
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;}
его здорово использовать в качестве словаря строк, пар объектов.. единственное неудобство заключается в том, что если вы используете его для присвоения значений другом месте с карта.получить (ключ) IDE, как код дает вам проблемы о том, возможно, неопределенным.. вместо создания переменной с определенными проверить .. просто приведите тип (предполагая, что вы точно знаете, что карта имеет пара ключ-значение)
class myclass { mymap:Map<string,object> ... mymap = new Map<string,object>() mymap.set("akey",AnObject) let objectref = <AnObject>mymap.get("akey")
добавить
"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>
С lib config option вы можете выбрать карту вишни в свой проект. Просто добавьте
es2015.collection
в ваш раздел lib. Когда у вас нет lib config, добавьте его с помощью по умолчанию и добавитьes2015.collection
.поэтому, когда у вас есть цель: es5, измените tsconfig.json to:
"target": "es5", "lib": [ "dom", "es5", "scripthost", "es2015.collection" ],