EDIT (5 Jun 2019): Sementara gagasan bahwa "TypeScript mendukung Map
secara asli" masih benar, karena versi 2.1 TypeScript mendukung sesuatu yang disebut Record
.
type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
"a": { name: "joe" },
"b": { name: "bart" },
};
Sayangnya parameter generik pertama (tipe kunci) masih belum sepenuhnya dihormati: bahkan dengan string
tipe, sesuatu seperti peopleA[0]
(a number
) masih valid.
EDIT (25 Apr 2016): Jawaban di bawah ini sudah tua dan tidak boleh dianggap sebagai jawaban terbaik. TypeScript memang mendukung Maps "secara native" sekarang, jadi ini hanya memungkinkan ES6 Maps untuk digunakan ketika outputnya adalah ES6. Untuk ES5, itu tidak menyediakan polyfill; Anda harus menanamkannya sendiri.
Untuk informasi lebih lanjut, lihat jawaban mohamed hegazy di bawah ini untuk jawaban yang lebih modern, atau bahkan komentar reddit ini untuk versi singkat.
Pada versi 1.5.0 beta, TypeScript belum mendukung Maps . Ini juga belum menjadi bagian dari peta jalan .
Solusi terbaik saat ini adalah objek dengan kunci dan nilai yang diketik (kadang-kadang disebut hashmap). Untuk objek dengan kunci tipe string
, dan nilai tipe number
:
var arr : { [key:string]:number; } = {};
Namun, beberapa peringatan:
- kunci hanya dapat bertipe
string
ataunumber
- Sebenarnya tidak masalah apa yang Anda gunakan sebagai tipe kunci, karena angka / string masih diterima secara bergantian (hanya nilainya yang dipaksakan).
Dengan contoh di atas:
// 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()
, saya akan melakukannyafor (var key in arr) ... arr[key]
ataufor...of
. Solusi lain (yang lebih dan lebih realistis saat ini dan akan sementara waktu untuk banyak hal) adalah dengan menggunakan corejs .map Map<string,string>=new Map<string,string>()
ketika saya melakukannyamap.set(something)
saya mendapatkan pengecualianmap is undefined
, apakah ada cara lain untuk menginisialisasi itu?Lihat komentar di: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964139
sumber
Berikut ini sebuah contoh:
Demo
sumber
TS2304
, silakan periksa ini: stackoverflow.com/questions/39416691/…Ya Peta sekarang tersedia dalam naskah .. jika Anda melihat di lib.es6.d.ts, Anda akan melihat antarmuka:
Sangat bagus untuk digunakan sebagai kamus string, pasangan objek .. satu-satunya gangguan adalah jika Anda menggunakannya untuk menetapkan nilai di tempat lain dengan Map.get (kunci) IDE seperti Kode memberi Anda masalah tentang kemungkinan tidak terdefinisi .. daripada membuat variabel dengan tanda centang yang ditentukan .. cukup masukkan tipe (dengan asumsi Anda tahu pasti peta memiliki pasangan kunci-nilai)
sumber
Anda harus menargetkan
--module es6
. Ini sangat disayangkan dan Anda dapat menyampaikan kekhawatiran Anda di sini: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111sumber
Minimal:
tsconfig:
dan instal polyfill seperti https://github.com/zloirock/core-js jika Anda menginginkan dukungan IE <11: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Peta
sumber
Tidak yakin apakah ini resmi tetapi ini berfungsi untuk saya dalam skrip 2.7.1:
Secara sederhana
Map<keyType, valueType>
sumber
Dengan opsi lib config, Anda dapat memilih cherry Map ke dalam proyek Anda. Cukup tambahkan
es2015.collection
ke bagian lib Anda. Ketika Anda tidak memiliki lib config, tambahkan satu dengan default dan tambahkanes2015.collection
.Jadi ketika Anda memiliki target: es5, ubah tsconfig.json ke:
sumber
Naskah belum mendukung
Map
.Tabel Kompatibilitas ES6
sumber
Tambahkan
"target": "ESNEXT"
properti ketsconfig.json
file.sumber