As formas de TypeScript estreitar um tipo dentro de um ramo, agrupadas por técnica: guardas incorporados, predicados personalizados, funções de asserção, uniões discriminadas, fluxo de igualdade e verdade, e estreitamento aliased e diferido. Cada linha emparelha a técnica com um exemplo de uma linha.
Estreitar é como o TypeScript transforma um tipo largo num mais estreito dentro de um ramo de código, para provar que um acesso a propriedade é seguro. Cada verificação (typeof, in, um predicado, um discriminador) diz ao compilador: a partir daqui, o valor é mais específico. As técnicas abaixo são o conjunto de trabalho.
Tabela de referência · 23 entradas
Estreitamento de Tipos em TypeScriptExplained
23 of 23 rows
Guardas incorporados
Estreita primitivos: string, number, boolean e mais.
if (typeof x === 'string') x.toUpperCase()
Estreita para uma instância de classe ou construtível.
if (e instanceof Error) e.message
Estreita verificando que uma propriedade existe no valor.
if ('id' in obj) obj.id
Estreita qualquer valor para array; estreita uma união para o seu membro array.
if (Array.isArray(x)) x.map(f)
Guardas personalizados
Uma função predicado cujo retorno estreita o argumento.
function isUser(x): x is User { return !!x.id }
Um predicado pode estreitar para uma união de tipos, não apenas um único.
function isKey(x): x is string | number
Um predicado de interseção mantém o tipo de entrada e acrescenta-lhe campos.
function hasId(x): x is x & { id: string }
Uma função de asserção que lança erro salvo se x for do tipo.
function assertUser(x): asserts x is User
Uniões discriminadas
Estreita uma união por um campo literal partilhado, via switch ou if.
type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Cada case estreita para um membro da união.
switch (u.kind) { case 'a': u.a }
Estreita uma união sem tag quando uma propriedade existe num só membro.
if ('b' in u) u.b
Cada case é uma condição; o case correspondente estreita o valor.
switch (true) { case typeof x === 'string': }
O case default atribui a never, provando que o switch é exaustivo.
default: { const x: never = u }
Igualdade e fluxo
Remove null e undefined após uma verificação de igualdade.