Tworzę klasę w maszynie, która ma właściwość, która jest mapą ES6 (ECMAscript 2016) w następujący sposób:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
Jak zadeklarować typ mapy ES6 w maszynie?
źródło
Tworzę klasę w maszynie, która ma właściwość, która jest mapą ES6 (ECMAscript 2016) w następujący sposób:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
Jak zadeklarować typ mapy ES6 w maszynie?
EDYCJA (5 czerwca 2019 r.): Chociaż idea, że „TypeScript obsługuje Map
natywnie”, jest nadal aktualna, ponieważ wersja 2.1 TypeScript obsługuje coś o nazwie Record
.
type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
"a": { name: "joe" },
"b": { name: "bart" },
};
Niestety, pierwszy parametr ogólny (typ klucza) nadal nie jest w pełni przestrzegany: nawet w przypadku string
typu coś takiego jak peopleA[0]
(a number
) jest nadal ważne.
EDYCJA (25 kwietnia 2016 r.): Poniższa odpowiedź jest stara i nie należy jej uważać za najlepszą. TypeScript obsługuje teraz mapy „natywnie”, więc po prostu umożliwia używanie map ES6, gdy wynik jest w formacie ES6. W przypadku ES5 nie zapewnia wypełniaczy; musisz je samodzielnie osadzić.
Aby uzyskać więcej informacji, zapoznaj się z odpowiedzią mohamed hegazy poniżej, aby uzyskać bardziej nowoczesną odpowiedź, lub nawet ten komentarz reddit dotyczący krótkiej wersji.
Od wersji beta 1.5.0 TypeScript nie obsługuje jeszcze Map . Nie jest to również jeszcze część planu działania .
Obecnie najlepszym rozwiązaniem jest obiekt z wpisanym kluczem i wartością (czasami nazywany hasmapą). Dla obiektu z kluczami typu string
i wartościami typu number
:
var arr : { [key:string]:number; } = {};
Jednak pewne zastrzeżenia:
string
lubnumber
W powyższym przykładzie:
// 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
values()
, co zrobiłbymfor (var key in arr) ... arr[key]
lubfor...of
. Innym rozwiązaniem (które jest coraz bardziej realistyczne w dzisiejszych czasach i przez jakiś czas będzie dla wielu rzeczy) jest użycie corejs .map Map<string,string>=new Map<string,string>()
gdymap.set(something)
otrzymam wyjątekmap is undefined
, czy istnieje inny sposób jej zainicjowania?Zobacz komentarz w: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
źródło
Oto przykład:
Próbny
źródło
TS2304
sprawdź to: stackoverflow.com/questions/39416691/…Tak Mapa jest teraz dostępna w maszynie. Jeśli spojrzysz na lib.es6.d.ts, zobaczysz interfejs:
Świetnie nadaje się do wykorzystania jako słownika par ciągów i obiektów ... jedyną irytacją jest to, że jeśli używasz go do przypisywania wartości w innym miejscu za pomocą Map.get (klucz), IDE, takie jak Code, powoduje problemy z byciem niezdefiniowanym .. zamiast tworzenie zmiennej ze sprawdzeniem jest zdefiniowane .. po prostu rzutuj typ (zakładając, że wiesz na pewno, że mapa ma parę klucz-wartość)
źródło
Musisz celować
--module es6
. To nieszczęście i możesz zgłosić swoje obawy tutaj: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111źródło
Jako absolutne minimum:
tsconfig:
i zainstaluj wypełnienie, takie jak https://github.com/zloirock/core-js, jeśli chcesz obsługiwać IE <11: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Mapa
źródło
Nie jestem pewien, czy to oficjalne, ale zadziałało to dla mnie w maszynie 2.7.1:
W prosty sposób
Map<keyType, valueType>
źródło
Dzięki opcji lib config możesz wybrać mapę do swojego projektu. Po prostu dodaj
es2015.collection
do swojej sekcji lib. Jeśli nie masz konfiguracji lib, dodaj jedną z ustawieniami domyślnymi i dodajes2015.collection
.Więc kiedy masz target: es5, zmień tsconfig.json na:
źródło
Maszynopis jeszcze nie obsługuje
Map
.Tabela zgodności ES6
źródło
Dodaj
"target": "ESNEXT"
właściwość dotsconfig.json
pliku.źródło