Cara TypeScript menyempitkan satu jenis dalam satu cabang, dikumpulkan mengikut teknik: guard terbina dalam, predikat tersuai, fungsi assertion, union didiskriminasi, aliran kesamaan dan truthiness, serta penyempitan alias dan tertunda. Setiap baris memadankan teknik dengan contoh satu baris.
Penyempitan ialah cara TypeScript menukar jenis yang luas kepada yang lebih sempit dalam satu cabang kod, supaya akses sifat dapat dibuktikan selamat. Setiap semakan (typeof, in, predikat, pembezah) memberitahu compiler: mulai sini, nilainya lebih khusus. Teknik di bawah ialah set kerjanya.
Jadual rujukan · 23 entri
Penyempitan jenis TypeScriptExplained
23 of 23 rows
Guard terbina dalam
Menyempitkan primitif: string, number, boolean dan lain-lain.
if (typeof x === 'string') x.toUpperCase()
Menyempitkan kepada instans kelas atau yang boleh dibina.
if (e instanceof Error) e.message
Menyempitkan dengan mengesan satu sifat wujud pada nilai.
if ('id' in obj) obj.id
Menyempitkan mana-mana nilai kepada tatasusunan; menyempitkan union kepada ahli tatasusunannya.
if (Array.isArray(x)) x.map(f)
Guard tersuai
Fungsi predikat yang pulangannya menyempitkan argumennya.
function isUser(x): x is User { return !!x.id }
Predikat boleh menyempitkan kepada union jenis, bukan satu jenis sahaja.
function isKey(x): x is string | number
Predikat persilangan mengekalkan jenis input dan menambah medan padanya.
function hasId(x): x is x & { id: string }
Fungsi assertion yang melontar ralat melainkan x adalah jenis itu.
function assertUser(x): asserts x is User
Union didiskriminasi
Menyempitkan union melalui medan literal berkongsi dengan switch atau if.
type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Setiap case menyempitkan kepada satu ahli union.
switch (u.kind) { case 'a': u.a }
Menyempitkan union tanpa tag apabila satu sifat wujud pada satu ahli sahaja.
if ('b' in u) u.b
Setiap case ialah satu syarat; case yang sepadan menyempitkan nilai itu.
switch (true) { case typeof x === 'string': }
Case default memperuntukkan kepada never, membuktikan switch itu lengkap.
default: { const x: never = u }
Kesamaan dan aliran
Membuang null dan undefined selepas semakan kesamaan.
if (x === null) return; x.toFixed()
Membuang nilai falsy (0, '', null, undefined, NaN).
if (!x) return; // x is defined here
Sifat berantai yang truthy membuktikan nilai asasnya wujud.
if (user?.active) user.name
Assertion bukan-null membuang null dan undefined tanpa semakan.
x!.toFixed(2)
Penentuan tugas: menyatakan x diberi nilai sebelum dibaca.
let name!: string; init()
Penyempitan berlaku dalam cabang dan selepas return awal.
if (!arr) return; arr.map(...)
Alias dan tertunda
Const boolean yang menyimpan semakan menyempitkan di mana ia diuji.
const isStr = typeof x === 'string'; if (isStr) …
Pemboleh ubah const mengekalkan penyempitannya dalam closure yang menangkapnya.
const s = get(); if (s) use(() => s.length)
Sejak TS 5.4, let atau parameter mengekalkan penyempitan dalam closure selepas penugasan terakhirnya.
let n: string | null = get(); if (n) use(() => n.length)
unknown tidak boleh digunakan sehingga guard menyempitkannya kepada jenis sebenar.