ProgramlamaTypeScript geliştiricisi

TypeScript'te Non-Null Assertion Operator (!) nasıl çalışır? Özellikleri nelerdir, kullanımı sırasında yaygın sorunlar nelerdir ve ne zaman gereklidir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Sorunun tarihi

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.

Sorun

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.

Çözüm

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:

  • Sadece derleme zamanı hata mesajını ortadan kaldırır, çalışma zamanı mantığını etkilemez.
  • Sadece değerin null olmadığını garanti eden yerlerde kullanılır.
  • Gereksiz veya bilinçsiz kullanım çalışma zamanı hatalarına yol açabilir.

Kandırmaca sorular.

! 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.

Yaygın hatalar ve anti-deseni

  • Değerin mevcut olduğundan emin değilken hatayı "bastırmak" için ! kullanımı.
  • Gerçek bağlamı anlamadan yaygın kullanım.
  • Gerekli tür veya güvenilir bir çalışma zamanı kontrolünün olduğu yerlerde ! kullanımı.

Hayat örneği

Olumsuz vaka

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:

  • Derleme hatasını bastırır.

Eksiler:

  • Mevcut olmayan bir öğeye erişirken kritik bir çalışma zamanı hatası meydana gelebilir.

Olumlu vaka

Kullanım öncesinde varlık kontrolü yapılması:

if (ref.current) { ref.current.focus(); }

Artılar:

  • Eleman henüz oluşturulmamışsa çalışma zamanı hatası yoktur
  • Kod şeffaf ve anlaşılır

Eksiler:

  • Açık bir kontrol için 1 satır daha gerektirir