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
Typenarrowing i TypeScriptExplained
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.