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)[]

Artikel terkait