javascript - ES6 mapa u Typescriptu


Stvaram klasu u TypeScriptu koja ima svojstvo koje je ES6 (ECMAscript 2016) Map, ovako:

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

Kako deklariram ES6 tip Map u TypeScriptu?

Odgovor #1

UREDI (5. lipnja 2019): Iako je ideja da "TypeScript nativno podržava Map" i dalje točna, od verzije 2.1 TypeScript podržava nešto što se zove Record.

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

Nažalost, prvi generički parametar (tip ključa) još uvijek nije u potpunosti poštovan: čak i s tipom string, nešto poput peopleA[0] (tipa number) i dalje je valjano.


UREDI (25. travnja 2016.): Donji odgovor je star i ne bi ga trebalo smatrati najboljim odgovorom. TypeScript sada "nativno" podržava Maps, pa jednostavno omogućuje korištenje ES6 Maps kada je izlaz ES6. Za ES5, ne pruža polyfille; morate ih sami uključiti.

Za više informacija, pogledajte odgovor Mohameda Hegazyja dolje za moderniji odgovor, ili čak ovaj komentar na Redditu za kraću verziju.


Od verzije 1.5.0 beta, TypeScript još ne podržava Maps. Također još nije dio plana razvoja.

Trenutno najbolje rješenje je objekt s tipiziranim ključem i vrijednošću (ponekad se naziva hashmapa). Za objekt s ključevima tipa string i vrijednostima tipa number:

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

Međutim, neke napomene:

  1. ključevi mogu biti samo tipa string ili number
  2. Zapravo nije važno što koristite kao tip ključa, budući da se brojevi/znakovi i dalje prihvaćaju naizmjenično (samo je vrijednost obavezna).

S gore navedenim primjerom:

// 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

Odgovor #2

Pogledajte komentar na: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139

TypeScript ne dolazi s ugrađenim pollyfillovima. Na vama je da odlučite koji pollyfill ćete koristiti, ako ga uopće koristite. Možete koristiti nešto poput es6Collection, es6-shims, corejs..itd. Sve što TypeScript prevoditelj treba je deklaracija za ES6 konstrukte koje želite koristiti. Sve ih možete pronaći u ovoj lib datoteci.

evo relevantnog dijela:

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;

Odgovor #3

Evo jednog primjera:

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

Demo

Odgovor #4

Da, Map je sada dostupan u TypeScriptu.. ako pogledaš u lib.es6.d.ts, vidjet ćeš sučelje:

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;} 

Sjajno je koristiti kao rječnik parova string, objekt.. jedina smetnja je što, ako ga koristite za dodjeljivanje vrijednosti negdje drugdje s Map.get(key), IDE poput Codea vam daje probleme zbog mogućnosti da je vrijednost nedefinirana.. umjesto stvaranja varijable s provjerom da li je definirana.. jednostavno pretvorite tip (pod pretpostavkom da sigurno znate da mapa ima taj par ključ-vrijednost)

class myclass {
   mymap:Map<string,object>
   ...
   mymap = new Map<string,object>()
   mymap.set("akey",AnObject)
   let objectref = <AnObject>mymap.get("akey")

Odgovor #5

Kako deklariram ES6 tip Map u TypeScriptu?

Morate ciljati --module es6. Ovo je nesretno i svoje zabrinutosti možete izraziti ovdje: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111

Odgovor #6

Kao gole minimum:

tsconfig:

 "lib": [
      "es2015"
    ]

i instalirajte polyfill kao što je https://github.com/zloirock/core-js ako želite podršku za IE < 11: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

Odgovor #7

Nisam siguran je li ovo službeno, ali ovo je kod mene funkcioniralo u Typescriptu 2.7.1:

class Item {
   configs: Map<string, string>;
   constructor () {
     this.configs = new Map();
   }
}

U jednostavnom Map<keyType, valueType>

Povezani članci