2015-05-03 20 views
60

Sto creando una classe a macchina che dispone di una proprietà che è un ES6 (ECMAscript 2016) Mappa in questo modo:ES6 Mappa in tipografico

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

Come posso dichiarare un tipo ES6 Mappa a macchina?

risposta

89

EDIT (25 aprile 2016): La risposta che segue è vecchio e non deve essere considerata la migliore risposta. TypeScript ora supporta "nativamente" Maps, quindi consente semplicemente di utilizzare ES6 Maps quando l'output è ES6. Per ES5, non fornisce polyfill; è necessario incorporarli da soli.

Per ulteriori informazioni, fare riferimento a mohamed hegazy's answer below per una risposta più moderna o anche a this reddit comment per una versione breve.


A partire dal 1.5.0 beta, dattiloscritto non supporta ancora Maps. Non fa ancora parte dello roadmap.

La soluzione migliore corrente è un oggetto con chiave e valore digitati (a volte chiamato hashmap). Per un oggetto con chiavi di tipo string, e valori di tipo number:

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

Alcuni avvertimenti, tuttavia:

  1. chiavi possono essere solo di tipo string o number
  2. In realtà non fa importa quello che usi come tipo di chiave, poiché i numeri/stringhe sono ancora accettati in modo intercambiabile (solo il valore è applicato).

Con l'esempio precedente:

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

In che modo quindi si iterano le proprietà nella mappa? Quando faccio arr.values ​​(), ottengo che "Property" values ​​"non esiste sul tipo ..." –

+0

Non lo stesso di 'values ​​()', farei 'per (var key in arr) .. .arr [chiave] 'o [' per ... di'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of). Altra soluzione (che al giorno d'oggi è sempre più realistica e sarà per un po 'di tempo) è l'uso di [corejs] (https://github.com/Microsoft/TypeScript/issues/3956). – zeh

+0

Infatti quando uso una qualsiasi chiave come proprietà su una mappa dichiarata in questo modo ottengo "Proprietà" qualunque "non esiste sul tipo" – rakslice

4

Il dattiloscritto non supporta ancora Map.

ES6 Compatibility Table

+4

Questa pagina sul wiki di dattiloscritto sembra dire che è supportato: https://typescript.codeplex.com/wikipage?title=ECMAScript%206%20Status&referringTitle=Roadmap – nicksrandall

87

si veda il commento in: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139

dattiloscritto non viene fornito con costruito in pollyfills. spetta a te a decidere quale polifarmaco usare, se presente. puoi usare qualcosa come es6Collection, es6-shims, corejs .. etc. Tutte le esigenze del compilatore Typetript sono una dichiarazione per i costrutti ES6 a cui si desidera utilizzare l' . li puoi trovare tutti in this lib file.

qui è la quota di competenza:

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; 
+2

Quando si sceglie ES5, anche con polyfill, non è possibile utilizzare alcune funzionalità - vedere https://github.com/Microsoft/TypeScript/issues/6842 –

11

Ecco un esempio:

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

Demo

+0

'errore TS2304: Impossibile trovare il nome 'Mappa'. – Zelphir

+1

@Zelphir Per il tuo errore 'TS2304', controlla questo: https://stackoverflow.com/questions/39416691/webpack-ts2304-cannot-find-name-map-set-promise –

0

Aggiungi "target": "ESNEXT" proprietà per il file tsconfig.json.

{ 
    "compilerOptions": { 
     "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ 
    } 
} 
0

Non sono sicuro se questo è ufficiale, ma questo ha lavorato per me in dattiloscritto 2.7.1:

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

In semplice Map<keyType, valueType>