Diberikan kode berikut
interface IPerson {
firstName: string;
lastName: string;
}
var persons: { [id: string]: IPerson; } = {
"p1": { firstName: "F1", lastName: "L1" },
"p2": { firstName: "F2" }
};
Mengapa inisialisasi tidak ditolak? Lagi pula, objek kedua tidak memiliki properti "lastName".
Index signatures are incompatible.
Type '{ firstName: string; }' is not assignable to type 'IPerson'.
Property 'lastName' is missing in type '{ firstName: string; }'.
Jawaban:
Sunting : Ini telah diperbaiki di versi TS terbaru. Mengutip komentar @ Simon_Weaver di pos OP:
Tampaknya ini tidak berfungsi saat meneruskan data awal saat deklarasi. Saya kira ini adalah bug dalam TypeScript, jadi Anda harus membuatnya di situs proyek.
Anda dapat menggunakan kamus yang diketik dengan memisahkan contoh Anda dalam deklarasi dan inisialisasi, seperti:
sumber
id
simbol? Sepertinya itu tidak perlu.id
simbol, Anda dapat mendeklarasikan apa jenis kunci kamus seharusnya. Dengan deklarasi di atas, Anda tidak dapat melakukan hal berikut:persons[1] = { firstName: 'F1', lastName: 'L1' }
id
simbol dapat diberi nama apa pun yang Anda suka dan dirancang seperti itu untuk membuatnya lebih mudah untuk membaca kode. mis{ [username: string] : IPerson; }
Untuk menggunakan objek kamus dalam naskah Anda dapat menggunakan antarmuka seperti di bawah ini:
dan, gunakan ini untuk tipe properti kelas Anda.
untuk menggunakan dan menginisialisasi kelas ini,
sumber
Saya setuju dengan thomaux bahwa kesalahan pengecekan tipe inisialisasi adalah bug TypeScript. Namun, saya masih ingin menemukan cara untuk mendeklarasikan dan menginisialisasi Kamus dalam satu pernyataan dengan pemeriksaan tipe yang benar. Implementasi ini lebih lama, namun menambahkan fungsionalitas tambahan seperti a
containsKey(key: string)
danremove(key: string)
metode. Saya menduga ini bisa disederhanakan begitu obat generik tersedia di rilis 0.9.Pertama kita mendeklarasikan kelas Kamus dasar dan Antarmuka. Antarmuka diperlukan untuk pengindeks karena kelas tidak dapat mengimplementasikannya.
Sekarang kita mendeklarasikan tipe khusus Orang dan antarmuka Kamus / Kamus. Dalam catatan PersonDictionary bagaimana kita menimpa
values()
dantoLookup()
mengembalikan tipe yang benar.Dan ini adalah contoh inisialisasi dan penggunaan yang sederhana:
sumber
containsKey(key: string): bool;
ini tidak berfungsi dengan TypeScript 1.5.0-beta . Itu harus diubah menjadicontainsKey(key: string): boolean;
.Berikut ini adalah implementasi Kamus yang lebih umum yang terinspirasi oleh ini dari @ dmck
sumber
Jika Anda ingin mengabaikan properti, tandai sebagai opsional dengan menambahkan tanda tanya:
sumber
Sekarang, ada perpustakaan yang menyediakan koleksi yang sangat diketik, queryable dalam naskah.
Koleksi-koleksi ini adalah:
Perpustakaan disebut ts-generic-collections-linq .
Kode sumber di GitHub:
https://github.com/VeritasSoftware/ts-generic-collections
NPM:
https://www.npmjs.com/package/ts-generic-collections-linq
Dengan perpustakaan ini, Anda dapat membuat koleksi (seperti
List<T>
) dan meminta mereka seperti yang ditunjukkan di bawah ini.sumber