Sätten som TypeScript snäver in en typ inuti en gren, grupperade efter teknik: inbyggda vakter, egna predikat, assertion-funktioner, diskriminerade unioner, likhets- och sanningsflöde samt aliaserad och uppskjuten narrowing. Varje rad parar tekniken med ett exempel på en rad.
Narrowing är hur TypeScript förvandlar en bred typ till en snävare inuti en kodgren, så att det kan bevisa att en egenskapsåtkomst är säker. Varje kontroll (typeof, in, ett predikat, en diskriminator) säger till kompilatorn: härifrån är värdet mer specifikt. Teknikerna nedan är arbetsuppsättningen.
Referenstabell · 23 poster
Typnarrowing i TypeScriptExplained
23 of 23 rows
Inbyggda vakter
Snäver in primitiver: string, number, boolean och flera.
if (typeof x === 'string') x.toUpperCase()
Snäver in till en instans av en klass eller något konstruerbart.
if (e instanceof Error) e.message
Snäver in genom att kontrollera att en egenskap finns på värdet.
if ('id' in obj) obj.id
Snäver in vilket värde som helst till en array; en union till dess arraymedlem.
if (Array.isArray(x)) x.map(f)
Egna vakter
En predikatfunktion vars returvärde snäver in argumentet.
function isUser(x): x is User { return !!x.id }
Ett predikat kan snäva in till en union av typer, inte bara till en enda.
function isKey(x): x is string | number
Ett snitt-predikat behåller indatatypen och lägger till fält på den.
function hasId(x): x is x & { id: string }
En assertion-funktion som kastar om x inte är av typen.
function assertUser(x): asserts x is User
Diskriminerade unioner
Snäver in en union efter ett gemensamt literal-fält, via switch eller if.
type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Varje case snäver in till en medlem av unionen.
switch (u.kind) { case 'a': u.a }
Snäver in en otaggad union när en egenskap bara finns på ett enda medlem.
if ('b' in u) u.b
Varje case är ett villkor; det matchade caset snäver in värdet.
switch (true) { case typeof x === 'string': }
Default-caset tilldelar till never och bevisar att switchen är uttömmande.
default: { const x: never = u }
Likhet och flöde
Tar bort null och undefined efter en likhetskontroll.
if (x === null) return; x.toFixed()
Tar bort falsy-värden (0, '', null, undefined, NaN).
if (!x) return; // x is defined here
En truthy kedjad egenskap bevisar att basvärdet finns.
if (user?.active) user.name
Icke-null-assertion tar bort null och undefined utan en kontroll.
x!.toFixed(2)
Definitiv tilldelning: deklarerar att x tilldelas innan det läses.
let name!: string; init()
Narrowing gäller inuti grenen och efter tidiga return.
if (!arr) return; arr.map(...)
Aliaserat och uppskjutet
Ett const-booleskt värde som håller en kontroll snäver in överallt där det testas.
const isStr = typeof x === 'string'; if (isStr) …
En const-variabel behåller sin narrowing inuti closures som fångar den.
const s = get(); if (s) use(() => s.length)
Sedan TS 5.4 behåller en let eller parameter sin narrowing i closures efter sin senaste tilldelning.
let n: string | null = get(); if (n) use(() => n.length)
unknown kan inte användas förrän en vakt snäver in det till en riktig typ.