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?
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:
EDIT (5 Haziran 2019): "TypeScript Map
yerel 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 string
ve değer türünde bir nesne için number
:
var arr : { [key:string]:number; } = {};
Ancak bazı uyarılar:
string
veyanumber
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
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ı?
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;
TS2304
lütfen aşağıdakileri kontrol edin: stackoverflow.com/questions/39416691/…
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")
Yazı tipinde ES6 Harita türünü nasıl bildirebilirim?
Hedeflemelisin --module es6
. Bu bir talihsizliktir ve endişenizi burada artırabilirsiniz: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
Minimum olarak:
tsconfig:
"lib": [
"es2015"
]
IE <11 desteği istiyorsanız https://github.com/zloirock/core-js gibi bir çoklu dolgu yükleyin : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Harita
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>
Lib config seçeneği ile Harita'yı projenize çekebilirsiniz. Sadece es2015.collection
lib 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" ],