Skip to content

Narrowing tipe TypeScript dijelaskan

Cara-cara TypeScript menyempitkan sebuah tipe di dalam cabang, dikelompokkan per teknik: guard bawaan, predikat kustom, fungsi assertion, union terdiskriminasi, alur equality dan truthiness, serta narrowing alias dan deferred. Setiap baris memasangkan teknik dengan contoh satu baris.

Narrowing adalah cara TypeScript mengubah tipe yang lebar menjadi lebih sempit di dalam cabang kode, sehingga akses properti bisa terbukti aman. Setiap pengecekan (typeof, in, predikat, diskriminator) memberi tahu compiler: mulai dari sini, nilainya lebih spesifik. Teknik-teknik di bawah adalah set kerjanya.

Tabel referensi · 23 entri
23 of 23 rows
Guard bawaan
Menyempitkan primitif: string, number, boolean, dan lainnya.if (typeof x === 'string') x.toUpperCase()
Menyempitkan ke instans kelas atau yang bisa dikonstruksi.if (e instanceof Error) e.message
Menyempitkan dengan memeriksa sebuah properti ada pada nilai.if ('id' in obj) obj.id
Menyempitkan nilai apa pun ke array; menyempitkan union ke anggota array-nya.if (Array.isArray(x)) x.map(f)
Guard kustom
Fungsi predikat yang return-nya menyempitkan argumennya.function isUser(x): x is User { return !!x.id }
Predikat bisa menyempitkan ke union tipe, bukan hanya satu tipe.function isKey(x): x is string | number
Predikat intersection mempertahankan tipe input dan menambahkan field padanya.function hasId(x): x is x & { id: string }
Fungsi assertion yang melempar error kecuali x adalah tipe tersebut.function assertUser(x): asserts x is User
Union terdiskriminasi
Menyempitkan union lewat field literal bersama dengan switch atau if.type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Setiap case menyempitkan ke satu anggota union.switch (u.kind) { case 'a': u.a }
Menyempitkan union tanpa tag saat sebuah properti hanya ada di satu anggota.if ('b' in u) u.b
Setiap case adalah kondisi; case yang cocok menyempitkan nilainya.switch (true) { case typeof x === 'string': }
Case default mengisi nilai ke never, membuktikan switch-nya lengkap.default: { const x: never = u }
Equality dan alur
Menghapus null dan undefined setelah pengecekan equality.if (x === null) return; x.toFixed()
Menghapus nilai falsy (0, '', null, undefined, NaN).if (!x) return; // x is defined here
Properti berantai yang truthy membuktikan nilai dasarnya ada.if (user?.active) user.name
Non-null assertion menghapus null dan undefined tanpa pengecekan.x!.toFixed(2)
Definite assignment: menyatakan x diberi nilai sebelum dibaca.let name!: string; init()
Narrowing berlaku di dalam cabang dan setelah early return.if (!arr) return; arr.map(...)
Alias dan deferred
Const boolean yang menampung pengecekan menyempitkan di mana pun ia diuji.const isStr = typeof x === 'string'; if (isStr) …
Variabel const mempertahankan narrowing-nya di dalam closure yang menangkapnya.const s = get(); if (s) use(() => s.length)
Sejak TS 5.4, let atau parameter tetap menyempitkan di closure setelah assignment terakhirnya.let n: string | null = get(); if (n) use(() => n.length)
unknown tidak bisa dipakai sampai sebuah guard menyempitkannya ke tipe nyata.if (typeof u === 'string') u.length