El ! pospuesto le indica al compilador "garantizo que este valor no es null ni undefined aquí", eliminando null/undefined de su tipo sin ninguna comprobación en tiempo de ejecución.
() {
.(name!.());
}
El ! pospuesto le indica al compilador "garantizo que este valor no es null ni undefined aquí", eliminando null/undefined de su tipo sin ninguna comprobación en tiempo de ejecución.
() {
.(name!.());
}
Es puramente una aserción de tiempo de compilación: al igual que as, no hace ninguna verificación en tiempo de ejecución. Si te equivocas, falla:
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 una de estas maneja el caso en que está ausente en lugar de asumirlo por aserción.
! es una herramienta afilada: silencia la seguridad ante valores nulos que el compilador intenta darte.
A veces está justificado (tienes conocimiento que al compilador le falta), pero abusar de él reintroduce exactamente los errores de fallo por valores nulos que strictNullChecks previene.
Recurre primero a ?., ?? o a una comprobación explícita; usa ! solo cuando realmente puedas demostrar que no es nulo.