Το suffix ! λέει στον compiler "Εγγυώμαι ότι αυτή η τιμή δεν είναι null ή undefined εδώ" — αφαιρεί null/undefined από τον τύπο της χωρίς καμία έλεγχο runtime.
ts
() {
.(name!.());
}
Το suffix ! λέει στον compiler "Εγγυώμαι ότι αυτή η τιμή δεν είναι null ή undefined εδώ" — αφαιρεί null/undefined από τον τύπο της χωρίς καμία έλεγχο runtime.
() {
.(name!.());
}
Είναι καθαρά μια assertion compile-time — όπως το as, δεν εκτελεί καμία επαλήθευση runtime. Αν κάνεις λάθος, θα κραχ:
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
Κάθε μία από αυτές χειρίζεται την περίπτωση που λείπει αντί να την αγνοεί.
Το ! είναι ένα αιχμηρό εργαλείο: σιωπηλοποιεί την ασφάλεια null που προσπαθεί να σου δώσει ο compiler.
Είναι περιστασιακά δικαιολογημένο (έχεις γνώση που λείπει στον compiler), αλλά η υπερχρήση εισάγει ξανά ακριβώς τα null-crash bugs που αποτρέπει το strictNullChecks.
Φτάσε για ?., ??, ή ένα ρητό guard πρώτα· χρησιμοποίησε ! μόνο όταν μπορείς πραγματικά να αποδείξεις τη μη-nullness.