O postfix ! diz ao compilador "Eu garanto que este valor não é null ou undefined aqui" — removendo null/undefined do seu tipo sem nenhuma verificação em tempo de execução.
() {
.(name!.());
}
O postfix ! diz ao compilador "Eu garanto que este valor não é null ou undefined aqui" — removendo null/undefined do seu tipo sem nenhuma verificação em tempo de execução.
() {
.(name!.());
}
É puramente uma asserção em tempo de compilação — assim como as, não faz nenhuma verificação em tempo de execução. Se você estiver errado, ele quebra:
const el = document.getElementById("app")!; // assert non-null
el.innerHTML = "hi"; // 💥 runtime error if #app doesn't actually exist
// 1. You've logically guaranteed it, but the compiler can't see it
if (map.has(key)) map.get(key)!.doThing(); // has() proves get() isn't undefined
// 2. Class fields initialized outside the constructor (DI, lifecycle hooks)
class C { value!: string; } // definite assignment assertion
name?.toUpperCase(); // optional chaining — no crash, yields undefined
const x = name ?? "default"; // provide a fallback
if (name) name.toUpperCase(); // narrow with a real check
Cada uma dessas opções trata o caso faltante em vez de apenas afirmá-lo.
! é uma ferramenta afiada: ela silencia a proteção contra nulidade que o compilador está tentando lhe dar.
É ocasionalmente justificado (você tem conhecimento que o compilador não possui), mas usar em excesso reintroduz exatamente os bugs de crash por nulidade que strictNullChecks previne.
Recorra a ?., ?? ou uma proteção explícita primeiro; use ! apenas quando você puder realmente provar a não-nulidade.