Постфиксный оператор ! говорит компилятору «я гарантирую, что это значение не null или undefined здесь» — удаляя null/undefined из его типа без каких-либо проверок во время выполнения.
() {
.(name!.());
}
Постфиксный оператор ! говорит компилятору «я гарантирую, что это значение не null или undefined здесь» — удаляя null/undefined из его типа без каких-либо проверок во время выполнения.
() {
.(name!.());
}
Это чисто утверждение на этапе компиляции — как as, оно не выполняет проверку во время выполнения. Если вы ошибаетесь, программа падает:
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, которую компилятор пытается вам обеспечить.
Иногда это оправдано (у вас есть знания, которых нет у компилятора), но чрезмерное использование реинтродуцирует ровно те самые баги с null-крахами, которые предотвращает strictNullChecks.
В первую очередь используйте ?., ?? или явную проверку; используйте ! только тогда, когда вы можете действительно доказать ненулевость.