Type Narrowing
Menyempitkan union type dengan typeof, in, instanceof, dan truthiness check.
Kenapa Union Perlu Disempitkan
function proses(x: string | number | null) {
// di sini x bisa tiga hal sekaligus: tidak aman dipakai langsung
}Narrowing adalah teknik memberi tahu compiler "di cabang ini, x pasti tipe tertentu" lewat pengecekan yang juga valid di runtime.
typeof Guard
function proses(x: string | number) {
if (typeof x === "string") {
return x.toUpperCase(); // x: string
}
return x.toFixed(2); // x: number, karena string sudah tersingkir
}TypeScript menganalisis alur kontrol: setelah cabang string di-return, sisa kemungkinan hanyalah number. Ini disebut control flow analysis.
in Operator dan instanceof
type Kucing = { meong: () => void };
type Anjing = { gonggong: () => void };
function bersuara(hewan: Kucing | Anjing) {
if ("meong" in hewan) {
hewan.meong(); // hewan: Kucing
} else {
hewan.gonggong(); // hewan: Anjing
}
}in memeriksa keberadaan properti. instanceof memeriksa class di prototype chain, cocok untuk Error vs custom error class.
Truthiness Narrowing
function cetak(nama?: string) {
if (nama) {
console.log(nama.toUpperCase()); // nama: string, bukan undefined
}
}if (nama) menyingkirkan undefined, null, "", 0, dan false. Praktis, tapi hati-hati: string kosong dan angka nol ikut tersingkir. Kalau "" adalah nilai valid, pakai perbandingan eksplisit nama !== undefined.
Catatan teknis: Narrowing hanya berlaku di dalam alur kontrol tempat pengecekan dilakukan. Kalau kamu simpan
xke variabel lain atau pakai di callback async setelah pengecekan, compiler tidak lagi menjamin tipenya (kecuali variabelnyaconst). Untuk logika kompleks, type guard function (modul berikutnya) lebih rapi daripada if bertingkat.