Tavat, joilla TypeScript kaventaa tyyppiä haarassa, ryhmiteltyinä tekniikan mukaan: sisäänrakennetut tarkistukset, omat predikaatit, assertiofunktiot, diskriminoidut unionit, yhtäsuuruus- ja totuusarvovirtaus sekä alias- ja viivästetty kaventaminen. Jokainen rivi yhdistää tekniikan yksiriviseen esimerkkiin.
Kaventaminen (narrowing) on tapa, jolla TypeScript muuttaa laajan tyypin kapeammaksi koodihaaran sisällä, jotta se voi todistaa ominaisuuteen kohdistuvan käytön turvalliseksi. Jokainen tarkistus (typeof, in, predikaatti, diskriminantti) kertoo kääntäjälle: tästä eteenpäin arvo on tarkempi. Alla olevat tekniikat muodostavat työkaluvalikoiman.
Viitetaulukko · 23 merkintää
TypeScriptin tyyppien kaventaminenExplained
23 of 23 rows
Sisäänrakennetut tarkistukset
Kaventaa primitiivejä: string, number, boolean ja muita.
if (typeof x === 'string') x.toUpperCase()
Kaventaa arvon luokan tai muun konstruoitavan instanssiksi.
if (e instanceof Error) e.message
Kaventaa tarkistamalla, että arvolla on tietty ominaisuus.
if ('id' in obj) obj.id
Kaventaa minkä tahansa arvon taulukoksi; kaventaa unionin sen taulukkojäseneksi.
if (Array.isArray(x)) x.map(f)
Omat tarkistukset
Predikaattifunktio, jonka paluuarvo kaventaa argumentin.
function isUser(x): x is User { return !!x.id }
Predikaatti voi kaventaa tyyppien unioniin, ei vain yhteen tyyppiin.
function isKey(x): x is string | number
Leikkauspredikaatti säilyttää syötetyypin ja lisää siihen kenttiä.
function hasId(x): x is x & { id: string }
Assertiofunktio, joka heittää poikkeuksen, jos x ei ole annettua tyyppiä.
function assertUser(x): asserts x is User
Diskriminoidut unionit
Kaventaa unionin yhteisen literaalikentän perusteella switch- tai if-lauseella.
type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Jokainen case kaventaa unionin yhteen jäseneensä.
switch (u.kind) { case 'a': u.a }
Kaventaa tagittoman unionin, kun ominaisuus on vain yhdessä jäsenessä.
if ('b' in u) u.b
Jokainen case on ehto; täsmäävä case kaventaa arvon.
switch (true) { case typeof x === 'string': }
Default-haara sijoittaa arvon tyyppiin never ja todistaa switchin kattavuuden.
default: { const x: never = u }
Yhtäsuuruus ja virtaus
Poistaa null- ja undefined-arvot yhtäsuuruustarkistuksen jälkeen.
if (x === null) return; x.toFixed()
Poistaa epätosiset arvot (0, '', null, undefined, NaN).
if (!x) return; // x is defined here
Todinen ketjutettu ominaisuus todistaa perusarvon olevan olemassa.
if (user?.active) user.name
Ei-null-assertio poistaa null- ja undefined-arvot ilman tarkistusta.
x!.toFixed(2)
Määritelty sijoitus: ilmoittaa, että x saa arvonsa ennen lukemista.
let name!: string; init()
Kaventaminen pätee haaran sisällä ja enenaisten paluujen jälkeen.
if (!arr) return; arr.map(...)
Alias ja viivästetty kaventaminen
Const-totuusarvo, joka sisältää tarkistuksen, kaventaa kaikkialla, missä sitä testataan.
const isStr = typeof x === 'string'; if (isStr) …
Const-muuttuja säilyttää kaventamisensa sitä sieppaavissa sulkeumissa.
const s = get(); if (s) use(() => s.length)
TS 5.4:stä alkaen let-muuttuja tai parametri säilyttää kaventamisen sulkeumissa viimeisen sijoituksensa jälkeen.
let n: string | null = get(); if (n) use(() => n.length)
unknown-tyyppistä arvoa ei voi käyttää, ennen kuin tarkistus kaventaa sen todelliseksi tyypiksi.