Menu

Array TypeScript: Tipe, Array of Object, map dan filter

Cara memberi tipe pada array di TypeScript: T[] vs Array<T>, array of object, array yang menampung beberapa tipe, array readonly, dan apa yang dikembalikan map, filter, reduce, dan find. Ditambah jebakan includes pada array literal.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Tipe array di TypeScript adalah tipe elemennya diikuti []: string[] adalah array berisi string, number[] array berisi angka. Cara penulisan generic Array<string> adalah tipe yang sama. Setelah sebuah array diberi tipe, setiap elemen yang kamu tambahkan dan setiap elemen yang kamu baca punya tipe itu.

Baris @ts-expect-error adalah error kompilasi (TS2345). Di sini baris itu ditandai sebagai error yang diharapkan supaya bloknya tetap berjalan, dan karena tipe dihapus saat kompilasi, 42 benar-benar dimasukkan saat runtime: output-nya memperlihatkan hal itu.

string[] vs Array<string>

Ditulis sebagaiSama denganCatatan
string[]Array<string>Cara penulisan yang umum.
(string | number)[]Array<string | number>Kurung wajib ada: string | number[] berarti "sebuah string, atau array berisi angka".
readonly string[]ReadonlyArray<string>Tanpa push, pop, sort, atau penugasan lewat index.
User[]Array<User>Array of object memakai tipe objeknya.
string[][]Array<Array<string>>Array 2D (grid).

Pilih satu gaya untuk satu codebase. Aturan array-type dari typescript-eslint secara default memakai T[].

Array of Object

Deskripsikan elemennya dengan type alias atau interface, lalu pakai Type[]. Semua yang dibaca dari array itu diperiksa terhadap bentuk tersebut.

Object literal yang dimasukkan ke users harus cocok persis dengan User: admin yang tidak ada atau property yang salah ketik adalah error kompilasi.

map, filter, reduce, dan find yang Bertipe

Method array bersifat generic, jadi hasilnya membawa tipe. Apa yang dilakukan setiap method saat runtime dibahas di halaman method array JavaScript; tipenya adalah tambahan dari TypeScript:

MethodTipe hasil pada T[]
map(fn)U[], dengan U adalah nilai yang dikembalikan fn
filter(fn)T[] (atau tipe yang lebih sempit, lihat di bawah)
find(fn)T | undefined
findIndex(fn), indexOf(x)number (-1 kalau tidak ada)
some(fn), every(fn), includes(x)boolean
reduce(fn, init)tipe dari init (atau type argument, reduce<R>(...))
at(i)T | undefined
join(sep)string

Contoh terakhir berhasil karena TypeScript (sejak 5.5) menyimpulkan bahwa (n) => n !== undefined adalah type predicate, sehingga filter mengembalikan number[], bukan (number | undefined)[]. Untuk pemeriksaan yang tidak bisa disimpulkan, tulis predicate-nya sendiri: filter((x): x is User => x !== null).

Array yang Menampung Lebih dari Satu Tipe

Tipe elemen union mengizinkan campuran. Union dari tipe array tidak:

Kalau setiap posisi punya tipe yang tetap, seperti pasangan [name, age], pakai tuple: [string, number] tahu bahwa index 0 adalah string dan index 1 adalah number, sedangkan (string | number)[] tidak tahu.

Array Readonly

readonly T[] menghilangkan setiap method yang mengubah array. Pakai untuk parameter yang tidak boleh diubah oleh fungsi, dan untuk konstanta.

index.ts(3,12): error TS2339: Property 'push' does not exist on type 'readonly number[]'.

Hapus baris push dan blok itu mencetak 4. number[] yang bisa diubah selalu boleh dikirim ke tempat yang mengharapkan readonly number[], jadi parameter readonly tidak merugikan pemanggil sama sekali. Pemeriksaan ini hanya saat kompilasi: saat runtime, nilainya array biasa. Untuk mengurutkan array readonly, urutkan salinannya: [...values].sort().

Jebakan includes pada Array Literal

as const mengubah array menjadi tuple readonly berisi tipe literal. Itu berguna untuk daftar nilai yang diizinkan, tetapi includes-nya lalu hanya menerima literal tersebut:

Membungkus pemeriksaan itu dalam type guard (value is Color) berarti pelebaran tipe cukup dilakukan sekali, dan pemanggil mendapatkan kembali nilai yang sudah dipersempit.

Index dan Array Kosong

Membaca arr[i] menghasilkan tipe T, bahkan ketika i di luar jangkauan dan nilai runtime-nya undefined. at(i) bertipe T | undefined, dan opsi compiler noUncheckedIndexedAccess membuat akses index biasa juga mengembalikan T | undefined.

queue[0].toUpperCase() akan lolos kompilasi lalu melempar TypeError saat runtime. Pilih at(), pemeriksaan panjang array, atau noUncheckedIndexedAccess kalau sebuah index mungkin tidak ada.

Pertanyaan yang sering diajukan

Bagaimana cara mendeklarasikan tipe array di TypeScript?

Tulis tipe elemennya lalu diikuti []: let names: string[] = ["a", "b"]. Bentuk generic Array<string> artinya persis sama. Untuk array of object, pakai object type atau interface sebagai tipe elemennya: User[].

Apa bedanya string[] dan Array<string>?

Tidak ada: keduanya adalah dua cara menulis tipe yang sama. string[] lebih umum dipakai. Bentuk generic lebih enak dibaca untuk tipe elemen yang rumit, dan untuk array readonly, readonly string[] dan ReadonlyArray<string> juga sama persis.

Kenapa find mengembalikan undefined di TypeScript?

array.find() mengembalikan T | undefined karena bisa saja tidak ada elemen yang cocok. Dengan strict, kamu wajib menangani kasus undefined, lewat pemeriksaan if, optional chaining (found?.name), atau nilai default (found ?? fallback), sebelum memakai hasilnya.

Bagaimana cara memberi tipe array dengan beberapa tipe di TypeScript?

Pakai tipe elemen union di dalam kurung: (string | number)[] adalah array yang setiap elemennya string atau number. Itu berbeda dengan string[] | number[], yang berarti array berisi string saja atau array berisi number saja. Untuk urutan tipe yang tetap, seperti [string, number], pakai tuple.

Kenapa includes menghasilkan error pada array as const?

Array readonly berisi literal, seperti ["red", "green"] as const, punya includes(searchElement: "red" | "green"), jadi mengirim string biasa menghasilkan error TS2345. Perlebar tipe array-nya untuk pemeriksaan itu, (COLORS as readonly string[]).includes(input), sebaiknya di dalam type guard yang mempersempit input menjadi union literal.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai