Я создаю класс в typescript, у которого есть свойство, которое является ES6 (ECMAscript 2016). Например:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
Как объявить тип карты ES6 в typescript?
Я создаю класс в typescript, у которого есть свойство, которое является ES6 (ECMAscript 2016). Например:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
Как объявить тип карты ES6 в typescript?
РЕДАКТИРОВАТЬ (5 июня 2019 г.): Хотя идея о том, что "TypeScript изначально поддерживает Map
", все еще верна, поскольку версия 2.1 TypeScript поддерживает нечто, называемое Record
.
type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
"a": { name: "joe" },
"b": { name: "bart" },
};
К сожалению, первый универсальный параметр (тип ключа) все еще не полностью соблюдается: даже с string
типом что-то вроде peopleA[0]
(number
) все еще допустимо.
РЕДАКТИРОВАТЬ (25 апреля 2016 г.): приведенный ниже ответ является старым и не должен рассматриваться как лучший ответ. TypeScript теперь действительно поддерживает карты "изначально", поэтому он просто позволяет использовать карты ES6, когда на выходе выводится ES6. Для ES5 он не предоставляет полифилы; Вы должны вставить их сами.
Для получения дополнительной информации, обратитесь к ответу Мохамеда Хегази ниже для более современного ответа, или даже к этому комментарию reddit для короткой версии.
Начиная с бета-версии 1.5.0, TypeScript еще не поддерживает Карты. Это еще не часть дорожной карты.
В настоящее время лучшим решением является объект с типизированным ключом и значением (иногда называемый hashmap). Для объекта с ключами типа string
и значениями типа number
:
var arr : { [key:string]:number; } = {};
Некоторые предостережения, однако:
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
Смотрите комментарий в: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScript не поставляется со встроенными pollyfills. это зависит от вас решите, какой pollyfill использовать, если таковой имеется. вы можете использовать что-то вроде es6Collection, es6-прокладки, corejs..etc. Все TypescriptТребования компилятора - это декларация для конструкций ES6, которые вы хотите использовать. вы можете найти их все в этой библиотеке файл.
вот соответствующая часть:
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;
Вот пример:
this.configs = new Map<string, string>();
this.configs.set("key", "value");
Да Карта теперь доступна в машинописи.. если вы посмотрите в 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(key), IDE, такой как Code, дает вам проблемы с возможной неопределенностью.. а не создавая переменную с определенной проверкой. просто введите тип (предполагая, что вы точно знаете, что карта имеет пару ключ-значение)
class myclass {
mymap:Map<string,object>
...
mymap = new Map<string,object>()
mymap.set("akey",AnObject)
let objectref = <AnObject>mymap.get("akey")
Как объявить тип карты ES6 в typescript?
Вам нужно настроить таргетинг --module es6
. Это несчастливо, и вы можете поднять свою озабоченность здесь: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
Как минимум:
TSconfig:
"lib": [
"es2015"
]
и установите polyfill, например https://github.com/zloirock/core-js, если вы хотите, чтобы IE < 11: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Машинопись еще не поддерживает Map
.
С опцией lib config вы можете вставлять карту в свой проект. Просто добавьте es2015.collection
в раздел lib. Если у вас нет lib config, добавьте один с настройками по умолчанию и добавьте es2015.collection
.
Поэтому, когда у вас есть цель: es5, измените tsconfig.json на:
"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],
Не уверен, что это официально, но это работало для меня в машинописи 2.7.1:
class Item {
configs: Map<string, string>;
constructor () {
this.configs = new Map();
}
}
В простой Map<keyType, valueType>
Добавить свойство "target": "ESNEXT"
в файл tsconfig.json
.
{
"compilerOptions": {
"target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
}
}