Das Postfix-! sagt dem Compiler "Ich garantiere, dass dieser Wert hier nicht null oder undefined ist" — entfernt null/undefined aus seinem Typ ohne jede Runtime-Überprüfung.
() {
.(name!.());
}
Das Postfix-! sagt dem Compiler "Ich garantiere, dass dieser Wert hier nicht null oder undefined ist" — entfernt null/undefined aus seinem Typ ohne jede Runtime-Überprüfung.
() {
.(name!.());
}
Es ist rein eine Compile-Zeit-Assertion — wie as führt es keine Runtime-Verifikation durch. Wenn du dich irrst, stürzt es ab:
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
Jede dieser behandelt den fehlenden Fall, anstatt ihn zu ignorieren.
! ist ein scharfes Werkzeug: Es verschweigt die Null-Sicherheit, die dir der Compiler geben möchte.
Es ist gelegentlich gerechtfertigt (du hast Wissen, das dem Compiler fehlt), aber Übergebrauch führt wieder exakt die Null-Crash-Fehler ein, die strictNullChecks verhindert.
Griff zuerst zu ?., ??, oder einer expliziten Guard; verwende ! nur, wenn du Nicht-Null-heit wirklich beweisen kannst.