Skip to content

Typenarrowing i TypeScript forklart

Måtene TypeScript snevrer inn en type inne i en gren, gruppert etter teknikk: innebygde vakter, egendefinerte predikater, assertjonsfunksjoner, diskriminerte unioner, likhets- og sannhetsflyt, samt aliasert og utsatt narrowing. Hver rad kobler teknikken med et eksempel på én linje.

Narrowing er måten TypeScript gjør en vid type smalere inne i en kodegren, slik at den kan bevise at en egenskapsaksess er trygg. Hver sjekk (typeof, in, et predikat, en diskriminator) forteller kompilatoren: herfra er verdien mer spesifikk. Teknikkene nedenfor er arbeidssettet.

Referansetabell · 23 oppføringer
23 of 23 rows
Innebygde vakter
Snevrer inn primitiver: string, number, boolean og flere.if (typeof x === 'string') x.toUpperCase()
Snevrer inn til en instans av en klasse eller noe konstruerbart.if (e instanceof Error) e.message
Snevrer inn ved å sjekke at en egenskap finnes på verdien.if ('id' in obj) obj.id
Snevrer inn enhver verdi til en tabell; snevrer en union til sitt tabellmedlem.if (Array.isArray(x)) x.map(f)
Egendefinerte vakter
En predikatfunksjon hvis returverdi snevrer inn argumentet.function isUser(x): x is User { return !!x.id }
Et predikat kan snevre inn til en union av typer, ikke bare til én enkelt.function isKey(x): x is string | number
Et snitt-predikat beholder inndatatypen og legger felter til den.function hasId(x): x is x & { id: string }
En assertjonsfunksjon som kaster med mindre x er typen.function assertUser(x): asserts x is User
Diskriminerte unioner
Snevrer inn en union etter et felles literal-felt, via switch eller if.type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Hver case snevrer inn til ett medlem av unionen.switch (u.kind) { case 'a': u.a }
Snevrer inn en umerket union når en egenskap bare finnes på ett medlem.if ('b' in u) u.b
Hver case er en betingelse; den treffende casen snevrer inn verdien.switch (true) { case typeof x === 'string': }
Default-casen tilordner til never og beviser at switchen er uttømmende.default: { const x: never = u }
Likhet og flyt
Fjerner null og undefined etter en likhetssjekk.if (x === null) return; x.toFixed()
Fjerner falsy-verdier (0, '', null, undefined, NaN).if (!x) return; // x is defined here
En truthy kjedet egenskap beviser at basisverdien finnes.if (user?.active) user.name
Ikke-null-assertjon fjerner null og undefined uten en sjekk.x!.toFixed(2)
Bestemt tilordning: erklærer at x tilordnes før den leses.let name!: string; init()
Narrowing gjelder inne i grenen og etter tidlige returer.if (!arr) return; arr.map(...)
Aliasert og utsatt
En const med boolsk verdi som holder en sjekk, snevrer inn overalt der den testes.const isStr = typeof x === 'string'; if (isStr) …
En const-variabel beholder sin narrowing inne i closures som fanger den.const s = get(); if (s) use(() => s.length)
Siden TS 5.4 beholder en let eller parameter sin narrowing i closures etter sin siste tilordning.let n: string | null = get(); if (n) use(() => n.length)
unknown kan ikke brukes før en vakt snevrer den inn til en reell type.if (typeof u === 'string') u.length