narrowingunioncontrol-flowMenengah4 mnt baca

Type Narrowing

Menyempitkan union type dengan typeof, in, instanceof, dan truthiness check.

Kenapa Union Perlu Disempitkan

typescript
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

typescript
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

typescript
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

typescript
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 x ke variabel lain atau pakai di callback async setelah pengecekan, compiler tidak lagi menjamin tipenya (kecuali variabelnya const). Untuk logika kompleks, type guard function (modul berikutnya) lebih rapi daripada if bertingkat.