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 sebagai | Sama dengan | Catatan |
|---|---|---|
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:
| Method | Tipe 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.