Mapa ES6 en mecanografiado

Resuelto nicksrandall asked hace 9 años • 11 respuestas

Estoy creando una clase en mecanografiado que tiene una propiedad que es un mapa ES6 (ECMAscript 2016) así:

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

¿Cómo declaro un tipo de mapa ES6 en mecanografiado?

nicksrandall avatar May 04 '15 04:05 nicksrandall
Aceptado

EDITAR (5 de junio de 2019): si bien la idea de que "TypeScript es compatible Mapde forma nativa" sigue siendo cierta, desde la versión 2.1 de TypeScript admite algo llamado Record.

type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
    "a": { name: "joe" },
    "b": { name: "bart" },
};

Desafortunadamente, el primer parámetro genérico (tipo de clave) todavía no se respeta por completo: incluso con un stringtipo, algo como peopleA[0](a number) sigue siendo válido.


EDITAR (25 de abril de 2016): la respuesta a continuación es antigua y no debe considerarse la mejor respuesta. TypeScript ahora admite mapas "de forma nativa", por lo que simplemente permite que se utilicen mapas ES6 cuando la salida es ES6. Para ES5, no proporciona polyfills; necesitas incrustarlos tú mismo.

Para obtener más información, consulte la respuesta de Mohamed Hegazy a continuación para obtener una respuesta más moderna, o incluso este comentario de Reddit para obtener una versión corta.


A partir de la versión 1.5.0 beta, TypeScript aún no es compatible con Maps . Tampoco forma parte todavía de la hoja de ruta .

La mejor solución actual es un objeto con clave y valor escritos (a veces llamado mapa hash). Para un objeto con claves de tipo stringy valores de tipo number:

var arr : { [key:string]:number; } = {};

Algunas advertencias, sin embargo:

  1. Las claves sólo pueden ser de tipo stringonumber
  2. En realidad, no importa qué use como tipo de clave, ya que los números/cadenas aún se aceptan indistintamente (solo se aplica el valor).

Con el ejemplo anterior:

// 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
zeh avatar May 03 '2015 21:05 zeh

Ver comentario en: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139

TypeScript no viene con pollyfills integrados. Depende de usted decidir qué pollyfill utilizar, si corresponde. puedes usar algo como es6Collection , es6-shims , corejs , etc. Todo lo que necesita el compilador Typecript es una declaración para las construcciones de ES6 que desea utilizar. Puede encontrarlos todos en este archivo lib .

Aquí está la parte relevante:

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;
mohamed hegazy avatar May 07 '2015 21:05 mohamed hegazy

Aquí hay un ejemplo:

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

Manifestación

Arnaud avatar Jul 26 '2017 03:07 Arnaud