პოსფიქსი ! ატყობინებს კომპილერს "გარანტიdesarrollوю, რომ ეს მნიშვნელობა არ არის null ან undefined აქ" — ამოცილებს null/undefined-ს მის ტიპიდან რაიმე runtime შემოწმების გარეშე.
() {
.(name!.());
}
პოსფიქსი ! ატყობინებს კომპილერს "გარანტიdesarrollوю, რომ ეს მნიშვნელობა არ არის null ან undefined აქ" — ამოცილებს null/undefined-ს მის ტიპიდან რაიმე runtime შემოწმების გარეშე.
() {
.(name!.());
}
ეს წმინდა 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-უსაფრთხოების დაცვას, რომელსაც კომპილერი ცდილობს გაცემოს.
ოკეის შემთხვევაში გამართლებული (თქვენ გაქვთ ცოდნა, რომელიც კომპილერს არ აქვს), მაგრამ ზემეტი გამოყენება დაბრუნებთ ზუსტ null-crash ბაგებს, რომელიც strictNullChecks აკვეზებს.
უპირატესობა მიეცით ?., ??, ან ხელმისაწვდომი დაცვას ჯერ; გამოიყენეთ ! მხოლოდ როდესაც ნამდვილად შეგიძლიათ დაამტკიცოთ non-nullness.