Postfix ! کمپائلر سے کہتا ہے "میں اس بات کی ضمانت دیتا ہوں کہ یہ قیمت یہاں null یا undefined نہیں ہے" — بغیر کسی runtime check کے null/undefined کو اس کی قسم سے نکالتا ہے۔
() {
.(name!.());
}
Postfix ! کمپائلر سے کہتا ہے "میں اس بات کی ضمانت دیتا ہوں کہ یہ قیمت یہاں null یا undefined نہیں ہے" — بغیر کسی runtime check کے null/undefined کو اس کی قسم سے نکالتا ہے۔
() {
.(name!.());
}
یہ بالکل compile-time assertion ہے — 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-safety کو خاموش کر دیتا ہے جو کمپائلر آپ کو دینے کی کوشش کر رہا ہے۔
یہ کبھی کبھار جائز ہے (آپ کے پاس کمپائلر سے کچھ علم ہے)، لیکن اس کا بہت زیادہ استعمال بالکل null-crash bugs کو دوبارہ متعارف کروانے سے کرتا ہے جو strictNullChecks روکتا ہے۔
پہلے ?.، ??، یا واضح guard تک پہنچیں؛ ! کو صرف تب استعمال کریں جب آپ واقعی non-nullness کو ثابت کر سکتے ہوں۔