Non-Null Assertion Operator (!), TypeScript'te derleyiciye "Bu noktada değişkenin null veya undefined olmadığını biliyorum" demek için özel bir sözdizimidir. Bu operatör, programcının bir değerin var olduğundan emin olduğu senaryolarda TypeScript'in bunu garanti edemediği tipik sorunları çözmek için eklenmiştir.
TypeScript, değişkenlerin null veya undefined olma olasılığına karşı çok katıdır, özellikle strictNullChecks seçeneği etkinleştirildiğinde. Programcının değerin güvenli olduğuna emin olduğu durumlarda derleyici uyarılarından kaçınmak için non-null assertion getirildi.
TypeScript, tüm kod akışlarını takip edemez ve belirli bir koşulun null olmadığını anlamayabilir. Bu, asenkron kodlardan sonra, callbacklerde ve DOM öğeleri işlenirken sıkça meydana gelir.
Non-Null Assertion Operator (!) derleyiciye bu noktada null/undefined olmadığını bildirir, tür hatasını ortadan kaldırır.
Kod örneği:
function processUser(user?: {name: string}) { // TS operatör olmadan hata verecektir: user undefined olabilir console.log(user!.name); // ! operatörü user'ın tanımlı olduğunu garanti eder }
Anahtar özellikler:
! her türlü değeri herhangi bir tür için kullanabilir miyim? Örneğin: let x: number = y!
! operatörü, derleyicinin görüşüne göre potansiyel olarak null/undefined içerebilecek türler için anlam kazanır. Null olamayacak şekilde tanımlanmış değişkenlerde etkisi yoktur.
! null/undefined kontrolünü tamamen kaldırır mı? Çalışma zamanı kontrolü yapmalı mıyım?
Hayır, ! operatörü çalışma zamanında kontroller yapmak için değildir. Sadece derleyiciye yardımcı olur ve eğer gerçek değer undefined/null olursa çalışma zamanı hatası meydana gelir.
function foo(data?: string) { // hata verebilir alert(data!.length); }
! asenkron kodda hata almaktan kurtarır mı, eğer başlangıçta değişken başka bir iş parçacığında değişiyorsa?
Hayır. ! operatörü sadece kullanıldığı noktada çalışır. Kontrol ile kullanım arasında değer undefined olursa hatadan kaçış yoktur. Her zaman null olma durumunun güncelliğinden emin olmak gerekir.
Bir React bileşeni içinde ref ile DOM'a erişilirken ! operatörü kullanılır, ancak ön kontrol yapılmadan:
const ref = useRef<HTMLDivElement>(null); ref.current!.focus(); // eğer ref.current null ise, çalışma zamanı hatası alınır
Artılar:
Eksiler:
Kullanım öncesinde varlık kontrolü yapılması:
if (ref.current) { ref.current.focus(); }
Artılar:
Eksiler: