narrowing Fundamentos do estreitamento (veracidade e atribuição)
Última atualização: 2026-10-22
narrowing Fundamentos do estreitamento (veracidade e atribuição)
Um tipo união reúne várias possibilidades em uma única variável, então, antes de usá-la, é preciso descobrir o que ela realmente é naquele momento — reduzir o tipo amplo a um tipo concreto chama-se estreitamento (narrowing). O TypeScript analisa o fluxo de controle (if, switch, verificações de veracidade) e estreita automaticamente a variável para o tipo do ramo correspondente; só então é seguro acessar os membros exclusivos desse ramo.
Grupo
Restrição e Asserções de Tipos
Tipo
Sintaxe
Modo strict
Não necessário
ℹ️ Info O editor transpila TypeScript para JavaScript e o executa (sem verificação de tipos); veja a Saída de cada exemplo para o resultado da verificação.
📝 Sintaxe
function handle(value: string | number | null) {
if (value == null) return; // elimina null/undefined por estreitamento
if (typeof value === "string") {
value.toUpperCase(); // value está estreitado para string aqui
} else {
value.toFixed(2); // value está estreitado para number aqui
}
}
⚙️ Parâmetros
== null
A igualdade frouxa filtra null e undefined em uma única verificação — o idioma mais comum para estreitar valores nulos
truthiness
Uma verificação de veracidade como if (value) remove de uma vez null, undefined, 0, "", false e NaN
Retorno:Sem valor de retorno — o estreitamento é uma análise de fluxo de controle em tempo de compilação e não gera nenhum código em tempo de execução.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
Hello, guest
Hello, guest
Hello, anonymous
Hello, Ada (length 3)
(Saída de execução após a transpilação; é possível acessar name.length com segurança em cada ramo porque o tsc já estreitou name para string — em tempo de execução existem apenas os valores)
ℹ️ Info O estreitamento é puramente de tempo de compilação: o TypeScript acompanha os tipos ao longo dos caminhos de execução (análise de fluxo de controle) e o JS transpilado não contém nenhum "código de estreitamento".
⚠️ Atenção As verificações de veracidade também filtram valores falsy legítimos: 0, "" e false. Quando 0 é um valor de negócio válido (preços, quantidades), prefira value != null ou uma verificação typeof explícita em vez de if (value).
💡 Dica O estreitamento é mais confiável em variáveis locais e em const; o estreitamento de propriedades de objetos pode ser invalidado por chamadas de função (o TS não sabe se a chamada a modificou) — copie a propriedade para uma variável local ou use uma função type guard.
P Qual é a diferença entre estreitamento e asserção de tipo (as)?
R O estreitamento é inferido automaticamente a partir das verificações que você escreve, de modo que verificações e tipos permanecem coerentes; uma asserção é uma declaração manual de tipo sem qualquer verificação. Prefira o estreitamento sempre que possível — uma asserção errada não é conferida pelo compilador.
P Por que obj.flag ainda pode ser undefined depois de já ter verificado if (!obj.flag)?
R Para acessos a propriedades, o TS não mantém o estreitamento através de possíveis efeitos colaterais — qualquer chamada de função intermediária pode modificá-lo. O mais seguro é copiar o valor para uma const local antes de verificá-lo.
P Uma única verificação consegue descartar null e undefined ao mesmo tempo?
R Sim: value == null (igualdade frouxa) filtra os dois de uma vez; value != null é o inverso. Com igualdade estrita === seriam necessárias duas comparações (=== null e === undefined).
Equipe Técnica Web-Tutorial
Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.