Ang mga paraan ng pagpapakitid ng TypeScript sa isang uri sa loob ng isang branch, nakagruppo ayon sa teknik: mga built-in na guard, custom na predicate, assertion function, discriminated union, daloy ng pagkakapantay at truthiness, at aliased at deferred na narrowing. Bawat row ay nagpapares ng teknik sa isang one-line na halimbawa.
Ang narrowing ay kung paano ginagawang mas kitid ng TypeScript ang isang malawak na uri sa loob ng isang code branch, upang mapatunayan nitong ligtas ang pag-access sa isang property. Bawat pagsusuri (typeof, in, isang predicate, isang discriminator) ay nagsasabi sa compiler: mula rito, mas tiyak na ang value. Ang mga teknik sa ibaba ang karaniwang gamit.
Talaan ng sanggunian · 23 mga entry
Type Narrowing sa TypeScriptExplained
23 of 23 rows
Mga built-in guard
Pinapakitid ang mga primitive: string, number, boolean, at iba pa.
if (typeof x === 'string') x.toUpperCase()
Pinapakitid sa isang instance ng class o ng ibang constructable.
if (e instanceof Error) e.message
Pinapakitid sa pamamagitan ng pagtitingin kung mayroong property ang value.
if ('id' in obj) obj.id
Pinapakitid ang anumang value sa isang array; pinapakitid ang union sa array member nito.
if (Array.isArray(x)) x.map(f)
Mga custom guard
Isang predicate function na ang return nito ay pinapakitid ang argument.
function isUser(x): x is User { return !!x.id }
Kaya ng isang predicate na lumikitid sa isang union ng mga uri, hindi lamang sa iisa.
function isKey(x): x is string | number
Ang intersection predicate ay pinapanatili ang input na uri at nagdaragdag ng mga field dito.
function hasId(x): x is x & { id: string }
Isang assertion function na nagtatapon maliban kung ang x ang uri.
function assertUser(x): asserts x is User
Mga discriminated union
Pinapakitid ang isang union gamit ang isang shared na literal field, sa pamamagitan ng switch o if.
type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Bawat case ay lumilikitid sa isang miyembro ng union.
switch (u.kind) { case 'a': u.a }
Pinapakitid ang isang untagged na union kapag may property sa iisang miyembro lamang.
if ('b' in u) u.b
Bawat case ay isang kondisyon; ang tumugmang case ang nagpapakitid sa value.
switch (true) { case typeof x === 'string': }
Ang default na case ay nagtatalaga sa never, na nagpapatunay na exhaustive ang switch.
default: { const x: never = u }
Pagkakapantay at daloy
Tinatanggal ang null at undefined pagkatapos ng pagsusuri ng pagkakapantay.
if (x === null) return; x.toFixed()
Tinatanggal ang mga falsy na value (0, '', null, undefined, NaN).
if (!x) return; // x is defined here
Ang truthy na naka-chain na property ay nagpapatunay na nandoon ang base na value.
if (user?.active) user.name
Ang non-null assertion ay tinatanggal ang null at undefined nang walang pagsusuri.
x!.toFixed(2)
Definite assignment: idinedeklara na ang x ay makakatanggap ng value bago ito mabasa.
let name!: string; init()
Naaangkop ang narrowing sa loob ng branch at pagkatapos ng mga early return.
if (!arr) return; arr.map(...)
Naka-alias at ipinagpaliban
Ang const boolean na nag-iimbak ng isang check ay lumilikitid saanman ito suriin.
const isStr = typeof x === 'string'; if (isStr) …
Ang const na variable ay pinapanatili ang narrowing sa loob ng mga closure na bumibigkis dito.
const s = get(); if (s) use(() => s.length)
Simula sa TS 5.4, ang let o parameter ay nananatiling narrowed sa loob ng closure pagkatapos ng huling pagtatalaga nito.
let n: string | null = get(); if (n) use(() => n.length)
Hindi magagamit ang unknown hanggang sa may guard na lumikitid dito sa isang tunay na uri.