Карта ES6 в машинописном тексте


Я создаю класс в typescript, который имеет свойство, которое является картой ES6 (ECMAscript 2016) следующим образом:

class Item {
  configs: ????;
  constructor () {
    this.configs = new Map();
  }
}

как объявить тип карты ES6 в typescript?

10 77

10 ответов:

EDIT (Apr 25 2016): ответ ниже старый и не должен считаться лучшим ответом. TypeScript теперь поддерживает карты "изначально", поэтому он просто позволяет использовать карты ES6, когда выход ES6. Для ES5 он не предоставляет полифилл; вам нужно встроить их самостоятельно.

для получения дополнительной информации см. ответ Мохаммеда Хегази ниже для более современного ответа, или даже это reddit комментарий на короткое версия.


по состоянию на 1.5.0 бета, TypeScript еще не поддерживает карты. Это еще не часть план, либо.

текущее лучшее решение-это объект с типизированным ключом и значением (иногда называемый hashmap). Для объекта с ключами типа string, и значения типа number:

var arr : { [key:string]:number; } = {};
некоторые предостережения:
  1. ключи могут быть только типа string или number
  2. 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;

вот пример:

this.configs = new Map<string, string>();
this.configs.set("key", "value");

демо

как объявить тип карты 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 еще не поддерживает Map.

таблица совместимости ES6

да КАрта теперь доступна в 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" ],