Skip to content

TypeScript típuszsűkítés elmagyarázva

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
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.if (typeof u === 'string') u.length