! Asserção não nula

Última atualização: 2026-10-22

! Asserção não nula

A asserção não nula (sufixo !) diz ao compilador "este valor com certeza não é null/undefined agora", reduzindo T | null | undefined a T. Ela não faz nenhuma verificação em tempo de execução — se o valor realmente estiver vazio, o erro aparece depois, no acesso ao membro — portanto reserve-a para os casos em que você realmente eliminou a possibilidade de vazio.

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

const el = document.getElementById("root")!;  // HTMLElement, não HTMLElement | null

const user = map.get("alice")!;                // User, não User | undefined
console.log(user.name);

⚙️ Parâmetros

!Operador de sufixo colocado após uma expressão: remove apenas null e undefined do tipo; não emite nenhum código em tempo de execução

Retorno:Sem efeito em tempo de execução — o ! desaparece após a transpilação; em tempo de compilação, ele apenas remove null/undefined do tipo.

▶ Exemplo

Edite o código abaixo e clique em Testar para ver o resultado transpilado:

Saída:

100
no record

(Saída de execução após a transpilação. aliceScore + 9 passa na verificação de tipos porque ! estreitou o tipo; escrever scores.get("bob")! + 1 compilaria, mas produziria NaN em tempo de execução — ! não faz verificação alguma)

💡 Observações

⚠️ Atenção ! é uma garantia verbal sem nenhuma validação em tempo de execução. Uma afirmação errada não falha imediatamente — lança TypeError em algum acesso de propriedade posterior, o que é difícil de rastrear. Prefira if (x) ou ?? sempre que servirem.
ℹ️ Info ! remove apenas null/undefined, nada mais: x! sobre string | number | null resulta em string | number, não em string.
💡 Dica Alguns usos amplamente aceitos: getElementById quando se sabe que o elemento existe; Map.get logo após Map.set da mesma chave; fixtures em código de teste. Concentrações de ! no fluxo principal do negócio são um mau sinal no código.
Mais casos em breve.

📚 Tutoriais relacionados

❓ Perguntas frequentes

P Qual é a diferença entre ! e ?. (encadeamento opcional)?
R Eles apontam em direções opostas: ! afirma "definitivamente não nulo" (ainda explode se estiver vazio), enquanto ?. admite "possivelmente vazio" e faz curto-circuito para undefined. Use ?. de forma defensiva; use ! só quando tiver certeza.
P Ainda é necessário ! com strictNullChecks desativado?
R Não — com strictNullChecks desativado, null/undefined são atribuíveis a qualquer coisa e ! não tem nada a fazer. Essa é uma das razões para manter strictNullChecks sempre ativo: sem ele, ! vira ruído puro e os bugs de valores vazios migram inteiramente para o tempo de execução.
P Por que muitas equipes desativam ! no ESLint?
R Porque ! absorve silenciosamente o risco de vazio e, ao contrário de uma verificação if, não dá erro de compilação quando refatorações invalidam a suposição. Desativá-lo força guards ou fallbacks com ??, o que é mais seguro a longo prazo; os raros usos justificados recebem um eslint-disable de linha.
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%