Mendefinisikan array dengan berbagai tipe di TypeScript
Saya memiliki array dengan bentuk: [ 1, "message" ].
Bagaimana saya akan mendefinisikan ini dalam TypeScript?
Jawaban #1
Mendefinisikan array dengan berbagai tipe di TypeScript
Gunakan tipe union (string|number)[] demo:
const foo: (string|number)[] = [ 1, "message" ];
Saya memiliki array dengan bentuk: [ 1, "pesan" ].
Jika Anda yakin bahwa selalu hanya ada dua elemen [number, string], maka Anda dapat menyatakannya sebagai tuple:
const foo: [number, string] = [ 1, "message" ];
Dan Anda bahkan dapat memberikan nama yang bermakna untuk anggota tuple misalnya id dan text:
const foo: [id: number, text: string] = [ 1, "message" ];
Jawaban #2
Jika Anda memperlakukannya sebagai tuple (lihat bagian 3.3.3 dari spesifikasi bahasa), maka:
var t:[number, string] = [1, "message"]
atau
interface NumberStringTuple extends Array<string|number>{0:number; 1:string}
var t:NumberStringTuple = [1, "message"];
Jawaban #3
TS lint saya mengeluh tentang solusi lain, jadi solusi yang bekerja untuk saya adalah:
item: Array<Type1 | Type2>
jika hanya ada satu jenis, boleh digunakan:
item: Type1[]
Jawaban #4
Pembaruan TypeScript 3.9+ (12 Mei 2020)
Sekarang, TypeScript juga mendukung tuple bernama. Ini sangat meningkatkan pemahaman dan pemeliharaan kode. Periksa playground resmi TS.
Jadi, sekarang alih-alih tanpa nama:
const a: [number, string] = [ 1, "message" ];
Kita bisa menambahkan nama:
const b: [id: number, message: string] = [ 1, "message" ];
Catatan: Anda perlu menambahkan semua nama sekaligus, Anda tidak bisa menghapus beberapa nama, misalnya:
type tIncorrect = [id: number, string]; // INCORRECT, 2nd element has no name, compile-time error.
type tCorrect = [id: number, msg: string]; // CORRECT, all have a names.
Tips: jika Anda tidak yakin dengan jumlah elemen terakhir, Anda bisa menulisnya seperti ini:
type t = [msg: string, ...indexes: number];// means first element is a message and there are unknown number of indexes.
TypeScript 4.x+ Tipe Tuple Variadik
Contoh terakhir harus diubah menjadi yang ini untuk TS 4.x:
type t = [msg: string, ...indexes: number[]];// means first element is a message and there are unknown number of indexes.
Tipe number diubah menjadi number[].
Info lebih lanjut di sini: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#variadic-tuple-types
Jawaban #5
Saya telah memutuskan format berikut untuk mengetik array yang dapat memiliki item dari berbagai jenis.
Array<ItemType1 | ItemType2 | ItemType3>Ini bekerja dengan baik pada pengujian dan penjaga tipe. https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types
Format ini tidak bekerja dengan baik untuk pengujian atau penjaga tipe:
(ItemType1 | ItemType2 | ItemType3)[]