ES6 Haritası


174

Bu gibi bir ES6 (ECMAscript 2016) Haritası olan bir özelliği olan typescript bir sınıf oluşturma:

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

Yazı tipinde ES6 Harita türünü nasıl bildirebilirim?

Yanıtlar:


234

EDIT (5 Haziran 2019): "TypeScript Mapyerel olarak destekliyor" fikri hala geçerli olsa da, 2.1 sürümünde TypeScript adı verilen bir şeyi destekliyor Record.

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

Maalesef ilk genel parametreye (anahtar türü) hala tam olarak uyulmuyor: bir türle bile string, peopleA[0](a number) gibi bir şey hala geçerli.


EDIT (25 Nis 2016): Aşağıdaki cevap eski ve en iyi cevap olarak düşünülmemelidir. TypeScript, Haritalar'ı artık "doğal olarak" desteklemektedir, bu nedenle çıktı ES6 olduğunda ES6 Haritalar'ın kullanılmasına izin verir. ES5 için çoklu dolgular sağlamaz; onları kendiniz gömmeniz gerekir.

Daha fazla bilgi için, daha modern bir cevap için mohamed hegazy'nin cevabına, hatta kısa bir versiyon için bu reddit yorumuna bakın.


1.5.0 beta sürümünden itibaren, TypeScript henüz Google Haritalar'ı desteklememektedir . Henüz yol haritasının da bir parçası değil.

Mevcut en iyi çözüm, anahtar ve değeri yazılan bir nesnedir (bazen hashmap olarak da adlandırılır). Anahtar türünde stringve değer türünde bir nesne için number:

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

Ancak bazı uyarılar:

  1. anahtarlar yalnızca tür stringveyanumber
  2. Anahtar türü olarak ne kullandığınız önemli değildir, çünkü sayılar / dizeler hala birbirinin yerine kullanılabilir (yalnızca değer uygulanır).

Yukarıdaki örnekle:

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

3
Peki haritadaki özellikleri nasıl tekrarlıyorsunuz? Arr.values ​​() yaptığımda, "Özellik 'değerleri' türünde yok ..." alıyorum
Vern Jensen

values()Yapacağım gibi değil for (var key in arr) ... arr[key]ya da for...of. Diğer çözüm (günümüzde daha gerçekçi ve bir süredir olacak) corejs kullanmaktır .
zeh

Aslında, bu şekilde beyan edilen bir harita üzerinde herhangi bir anahtarı özellik olarak kullandığımda, "
Özellikte

Ben yapı birine haritası sınıfını kullanıyorum ama yapmam bile map Map<string,string>=new Map<string,string>()ben ne zaman map.set(something) bir istisna olsun map is undefined, bunu başlatmak için başka bir yol var mı?
mautrok

1
Çoklu dolgular ile bile ES5'i hedeflerken belirli özellikleri kullanamazsınız - bkz. Github.com/Microsoft/TypeScript/issues/6842
Ondra Žižka

128

Yoruma bakın: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139

TypeScript yerleşik polly dolgular ile birlikte gelmez. Varsa hangi politili kullanacağınıza karar vermek size bağlıdır. gibi bir şey kullanabilirsiniz es6Collection , ES6-şimler , corejs ..etc. Tüm Typcript derleyicisinin ihtiyacı olan, kullanmak istediğiniz ES6 yapıları için bir bildirimdir. hepsini bu lib dosyasında bulabilirsiniz .

İşte ilgili bölüm:

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;

3
Çoklu dolgular ile bile ES5'i hedeflerken belirli özellikleri kullanamazsınız - bkz. Github.com/Microsoft/TypeScript/issues/6842
Ondra Žižka


30

Evet Harita şimdi daktiloda mevcut .. lib.es6.d.ts dosyasına bakarsanız, arayüzü göreceksiniz:

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

Dize, nesne çiftleri sözlüğü olarak kullanmak harika ... tek sıkıntı, Map.get (key) ile başka bir yerde değerler atamak için kullanıyorsanız , IDE'nin Code gibi tanımlanamayan olası sorunlar hakkında bilgi vermesidir. tanımlı bir kontrol ile bir değişken oluşturmak .. sadece türü döküm (haritanın anahtar / değer çiftine sahip olduğundan emin olduğunuzu varsayarak)

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



4

Bunun resmi olup olmadığından emin değilim ama bu benim için daktilo 2.7.1'de çalıştı:

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

Basit olarak Map<keyType, valueType>


3

Lib config seçeneği ile Harita'yı projenize çekebilirsiniz. Sadece es2015.collectionlib bölümünüze ekleyin . Herhangi bir lib yapılandırmanız yoksa , varsayılanlarla bir tane ekleyin ve ekleyin es2015.collection.

Hedefiniz: es5 olduğunda, tsconfig.json öğesini şu şekilde değiştirin:

"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],


0

Dosyaya "target": "ESNEXT"özellik ekleyin tsconfig.json.

{
    "compilerOptions": {
        "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.