Mapa ES6 en mecanografiado
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?
EDITAR (5 de junio de 2019): si bien la idea de que "TypeScript es compatible Map
de 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 string
tipo, 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 string
y valores de tipo number
:
var arr : { [key:string]:number; } = {};
Algunas advertencias, sin embargo:
- Las claves sólo pueden ser de tipo
string
onumber
- 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
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;
Aquí hay un ejemplo:
this.configs = new Map<string, string>();
this.configs.set("key", "value");
Manifestación