Postfix ! talar om för kompilatorn "Jag garanterar att detta värde inte är null eller undefined här" — den tar bort null/undefined från dess typ utan någon körtidskontroll.
ts
() {
.(name!.());
}
Postfix ! talar om för kompilatorn "Jag garanterar att detta värde inte är null eller undefined här" — den tar bort null/undefined från dess typ utan någon körtidskontroll.
() {
.(name!.());
}
Det är rent en kompileringstidskontroll — liksom as, utför den ingen körtidsverifiering. Om du har fel, kraschar det:
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
Var och en av dessa hanterar det saknade fallet istället för att göra ett påstående om det.
! är ett vassa verktyg: det tystnar ned den null-säkerhet kompilatorn försöker ge dig.
Det är ibland berättigat (du har kunskap kompilatorn saknar), men överanvändning av det återintroducerar exakt de null-krachfel som strictNullChecks förhindrar.
Gripa först till ?., ??, eller en explicit kontroll; använd ! endast när du verkligen kan bevisa non-nullness.