Postfixul ! spune compilatorului "Garantez că această valoare nu este null sau undefined aici" — eliminând null/undefined din tipul acesteia fără nicio verificare la runtime.
() {
.(name!.());
}
Postfixul ! spune compilatorului "Garantez că această valoare nu este null sau undefined aici" — eliminând null/undefined din tipul acesteia fără nicio verificare la runtime.
() {
.(name!.());
}
Este pur o asertare la compile-time — la fel ca as, nu face nicio verificare la runtime. Dacă greșești, programul se blochează:
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
Fiecare dintre acestea gestionează cazul lipsă în loc să-l afirmi.
! este un instrument puternic: întunecă siguranța null pe care o încearcă compilatorul să ți-o ofere.
Este ocazional justificat (ai cunoștințe pe care compilatorul nu le are), dar abuzarea acestuia reintroduce exact greșelile cu crash-uri din cauza null pe care strictNullChecks le previne.
Apelează mai întâi la ?., ??, sau la o gardă explicită; folosește ! doar când poți cu adevărat demonstra non-nullness.