Menu

Parameter Opsional TypeScript: Nilai Default dan Rest

Jadikan parameter TypeScript opsional dengan ?, beri nilai default, atau kumpulkan argumen sebanyak apa pun dengan rest parameter. Membahas aturan urutan, argumen yang dilewati vs undefined, options object, dan parameter opsional di tipe fungsi.

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

Tambahkan ? setelah nama parameter untuk membuatnya opsional. Pemanggil boleh tidak mengisinya, dan di dalam fungsi tipenya ikut memuat undefined.

TypeScript mengecek jumlah argumen, jadi tanpa ? pemanggilan pertama akan menjadi error kompilasi: Expected 2 arguments, but got 1. (TS2554).

Parameter Opsional Mungkin Bernilai undefined

Karena pemanggil bisa melewatinya, tipe parameter opsional di dalam fungsi adalah T | undefined. Dengan strictNullChecks, kamu harus menangani kasus undefined sebelum memakainya sebagai T.

Optional chaining (?.) dan nullish coalescing (??) adalah alat yang biasa dipakai di sini. Kalau nilai cadangannya tetap, parameter default lebih ringkas.

Nilai Default Parameter

Nilai default membuat parameter opsional bagi pemanggil dan memberinya tipe tanpa undefined di dalam fungsi. Tipenya disimpulkan dari nilai default, jadi anotasi sering tidak diperlukan.

Pemanggil melihat signature repeat(text: string, times?: number, separator?: string). Nilai default mengikuti aturan JavaScript: dipakai saat argumennya undefined, baik dilewati maupun dikirim secara eksplisit, dan tidak dipakai saat argumennya null. Ekspresi default boleh memakai parameter sebelumnya: function range(start: number, end = start + 10).

Aturan Urutan Parameter

DeklarasiLolos kompilasi?Catatan
(a: number, b?: number)YaParameter opsional ditaruh di akhir
(a?: number, b: number)TidakTS1016: A required parameter cannot follow an optional parameter.
(a = 0, b: number)YaTetapi pemanggil harus menulis f(undefined, 5) untuk memakai default-nya
(a: number, ...rest: number[])YaRest parameter selalu di akhir
(a?: number, ...rest: number[])YaParameter opsional sebelum rest diperbolehkan

Parameter dengan default sebelum parameter wajib memang sah, tetapi canggung. Bagi pemanggil, tipenya menjadi number | undefined, dan tidak ada yang senang menulis undefined sebagai pengisi tempat. Kalau kamu butuh parameter pertama yang fleksibel, pakai options object atau function overloading.

Dilewati vs undefined

x?: number dan x: number | undefined terlihat mirip dan punya tipe yang sama di dalam fungsi. Bedanya ada bagi pemanggil: yang pertama boleh dilewati, yang kedua wajib dikirim.

Pakai | undefined untuk argumen wajib yang boleh tidak punya nilai, sehingga setiap pemanggil harus memikirkannya. Pakai ? kalau melewatinya adalah pemanggilan yang normal. (Pesannya memang berbunyi "1 arguments": begitulah kata-kata TypeScript.)

Rest Parameter

Rest parameter, ...name: T[], mengumpulkan argumen sebanyak apa pun ke dalam sebuah array. Parameter ini harus berada di posisi terakhir.

Melakukan spread array ke parameter tetap lebih ketat. Rest parameter menerima spread dari number[] apa pun, tetapi fungsi yang dideklarasikan (a: number, b: number) hanya menerima spread dari tuple, karena TypeScript harus tahu panjangnya:

function point(x: number, y: number) { return { x, y }; }

const list = [3, 4];            // number[]
point(...list);
// error TS2556: A spread argument must either have a tuple type or be passed to a rest parameter.

const pair = [3, 4] as const;   // readonly [3, 4]
point(...pair);                 // fine

Rest parameter juga bisa bertipe tuple, yang memberi tipe pada setiap posisi: ...args: [name: string, age?: number].

Options Object

Begitu sebuah fungsi punya lebih dari dua atau tiga parameter opsional, pemanggil mulai kehilangan jejak posisinya. Options object dengan nilai default memberi argumen bernama yang urutannya bebas.

= {} di bagian akhir membuat seluruh object itu opsional. Tanpanya, fetchData("/a") adalah error kompilasi (Expected 2 arguments, but got 1., TS2554), dan di JavaScript biasa pemanggilan yang sama akan melempar TypeError saat runtime, karena destructuring butuh object untuk dibaca.

Parameter Opsional di Tipe Callback

Di tipe fungsi, ? berarti "pemanggil callback ini mungkin tidak mengirimnya". Artinya bukan "callback boleh melewatinya": callback selalu boleh mengabaikan parameter di bagian akhir. Jadi jangan tandai parameter callback sebagai opsional hanya supaya handler boleh menerima argumen lebih sedikit.

// Too loose: every handler must now cope with index being undefined
type Visit = (item: string, index?: number) => void;

// Right: the caller always passes both; handlers may use only item
type VisitStrict = (item: string, index: number) => void;
const log: VisitStrict = (item) => console.log(item);

Pertanyaan yang sering diajukan

Bagaimana cara membuat parameter opsional di TypeScript?

Taruh ? setelah namanya: function greet(name?: string). Pemanggil boleh tidak mengisinya, dan di dalam fungsi tipenya string | undefined, jadi kamu mengeceknya dulu sebelum memakainya. Memberi parameter nilai default, name = "there", juga membuatnya opsional dan menghilangkan undefined di dalam fungsi.

Apakah parameter opsional boleh ditulis sebelum parameter wajib di TypeScript?

Tidak kalau memakai ?: (a?: number, b: number) adalah error TS1016, "A required parameter cannot follow an optional parameter." Parameter dengan nilai default boleh ditulis lebih dulu, tetapi pemanggil lalu harus mengirim undefined secara eksplisit untuk memakai default-nya, jadi dalam praktiknya parameter opsional dan parameter dengan default ditaruh di akhir.

Apa perbedaan x?: number dan x: number | undefined?

Di dalam fungsi, keduanya bertipe number | undefined. Perbedaannya ada di tempat pemanggilan: dengan x?: number argumennya boleh dilewati, sedangkan dengan x: number | undefined argumennya wajib dikirim, walaupun nilainya undefined. Tidak mengirimnya menghasilkan error TS2554.

Apakah mengirim null akan memakai nilai default parameter?

Tidak. JavaScript hanya memakai default saat argumennya undefined (dilewati atau dikirim secara eksplisit). null adalah sebuah nilai, jadi ia tetap dipakai. Lagi pula, dengan strictNullChecks TypeScript menolak null untuk parameter bertipe number.

Bagaimana cara mengirim array sebagai argumen terpisah di TypeScript?

Spread array-nya: fn(...args). Untuk fungsi dengan parameter tetap, array-nya harus bertipe tuple seperti [number, number] atau berasal dari as const; melakukan spread pada number[] menghasilkan error TS2556 karena panjangnya tidak diketahui. Spread ke rest parameter (...values: number[]) selalu berhasil.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai