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 admite Map de forma nativa" sigue siendo cierta, dado que la versión 2.1 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 tipo de string , algo como peopleA[0] (un 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 admite Maps "de forma nativa" ahora, por lo que simplemente permite usar ES6 Maps cuando la salida es ES6. Para ES5, no proporciona rellenos polivalentes; necesita incrustarlos usted 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 una versión corta.
A partir de la versión beta 1.5.0, TypeScript aún no es compatible con Maps . Todavía no forma parte de la hoja de ruta, tampoco.
La mejor solución actual es un objeto con clave y valor escritos (a veces llamado hashmap). Para un objeto con claves de tipo string y valores de tipo number :
var arr : { [key:string]:number; } = {};Algunas advertencias, sin embargo:
string o numberCon 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 valueVer comentario en: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
TypeScript no viene con pollyfills integrados. depende de usted decidir qué pollyfill usar, si corresponde. puede usar algo como es6Collection , es6-shims , corejs , etc. Todo lo que necesita el compilador de TypeScript es una declaración para las construcciones ES6 que desea usar. 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");