A módok, ahogy a TypeScript egy ágon belül szűkít egy típust, technikánként csoportosítva: beépített guardok, saját predikátumok, asszertációs függvények, diszkriminált uniók, egyenlőségi és truthiness-folyam, valamint aliaszolt és halasztott szűkítés. Minden sor egy technikát párosít egy egysoros példával.
A szűkítés (narrowing) az, ahogy a TypeScript egy tág típusból szűkebbet készít egy kódágon belül, hogy bizonyítani tudja egy tulajdonságelérés biztonságát. Minden ellenőrzés (typeof, in, egy predikátum, egy diszkrimináns) ugyanazt üzeni a fordítónak: innentől az érték specifikusabb. Az alábbi technikák a munkakészlet.
Referenciatáblázat · 23 bejegyzés
TypeScript típuszsűkítésExplained
23 of 23 rows
Beépített guardok
Primitíveket szűkít: string, number, boolean és továbbiak.
if (typeof x === 'string') x.toUpperCase()
Egy osztály vagy konstruálható példányra szűkít.
if (e instanceof Error) e.message
Azzal szűkít, hogy ellenőrzi egy tulajdonság létezését az értéken.
if ('id' in obj) obj.id
Bármely értéket tömbre szűkít; az uniót a tömb tagjára szűkíti.
if (Array.isArray(x)) x.map(f)
Saját guardok
Predikátumfüggvény, amelynek visszatérési értéke szűkíti az argumentumot.
function isUser(x): x is User { return !!x.id }
A predikátum típusok uniójára is szűkíthet, nem csak egyetlen típusra.
function isKey(x): x is string | number
A metszetre szűkítő predikátum megtartja a bemeneti típust, és mezőket ad hozzá.
function hasId(x): x is x & { id: string }
Asszertációs függvény, amely kivételt dob, ha x nem a megadott típus.
function assertUser(x): asserts x is User
Diszkriminált uniók
Közös literális mezővel szűkíti az uniót switch vagy if segítségével.
type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Minden case az unió egy tagjára szűkít.
switch (u.kind) { case 'a': u.a }
Címkézetlen uniót szűkít, ha egy tulajdonság csak egy tagon létezik.
if ('b' in u) u.b
Minden case egy feltétel; az illeszkedő case szűkíti az értéket.
switch (true) { case typeof x === 'string': }
A default ág never-hez rendel, bizonyítva, hogy a switch kimerítő.
default: { const x: never = u }
Egyenlőség és vezérlési folyamat
Egyenlőségvizsgálat után eltávolítja a null és undefined típusokat.
if (x === null) return; x.toFixed()
Eltávolítja a falsy értékeket (0, '', null, undefined, NaN).
if (!x) return; // x is defined here
Egy truthy láncolt tulajdonság bizonyítja, hogy a bazisérték létezik.
if (user?.active) user.name
A non-null asszertáció ellenőrzés nélkül eltávolítja a null és undefined típusokat.
x!.toFixed(2)
Definitív értékadás: deklarálja, hogy x olvasás előtt értéket kap.
let name!: string; init()
A szűkítés az ágon belül és a korai return után is érvényes.
if (!arr) return; arr.map(...)
Aliaszolt és halasztott szűkítés
Egy ellenőrzést tároló const boolean ott szűkít, ahol kiértékelik.
const isStr = typeof x === 'string'; if (isStr) …
A const változó megtartja a szűkítést a befogó closure-ökben.
const s = get(); if (s) use(() => s.length)
A TS 5.4 óta egy let vagy paraméter megőrzi a szűkítést a closure-ökben az utolsó értékadása után.
let n: string | null = get(); if (n) use(() => n.length)
Az unknown nem használható, amíg egy guard valódi típusra nem szűkíti.