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.

GrupoRestrição e Asserções de Tipos
TipoSintaxe
Modo strictNã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

== nullA igualdade frouxa filtra null e undefined em uma única verificação — o idioma mais comum para estreitar valores nulos
truthinessUma 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)

💡 Observações

ℹ️ 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.
Mais casos em breve.

📚 Tutoriais relacionados

❓ Perguntas frequentes

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).
Web-Tutorial.com

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.

100%