Optional chaining mekanizması (?.), JavaScript'te, isteğe bağlı olarak tanımlanmış nesnelerin özelliklerine ve yöntemlerine güvenli bir şekilde erişim sağlamak amacıyla ortaya çıkmıştır. TypeScript'te özellikle faydalıdır çünkü undefined veya null olan özelliklere veya yöntemlere erişimle ilgili çalışma zamanı hatalarını önlemeye yardımcı olur.
Optional chaining'den önce, geliştiricilerin her bir nesne iç içe geçmiş seviye varlığını manuel olarak kontrol etmesi gerekiyordu, bu da kodu uzun ve okunması zor hale getiriyordu:
if (obj && obj.a && obj.a.b) { // ... }
Tanımsız bir nesneye erişimle ilgili iç içe geçmiş özelliklere erişirken çalışma zamanı hatası olasılığı vardı: Cannot read property 'x' of undefined. Ayrıca, uzun kontrol zincirleri, kodun bakımını ve algılama kolaylığını zorluyordu.
Optional chaining (?.), iç içe geçmiş özelliklere, yöntemlere veya dizi elemanlarına erişim sağlarken, herhangi bir kısım null veya undefined ise otomatik olarak undefined döner.
Kod örneği:
interface User { name: string; address?: { city?: string; }; } const user: User = { name: 'Ivan' }; console.log(user.address?.city); // undefined
Anahtar özellikler:
T | undefined, bu TypeScript derleyicisi tarafından dikkate alınır ve hataların önlenmesine yardımcı olur.Atama operatöründen önce optional chaining kullanabilir miyim? Örneğin: user.address?.city = 'Moscow'?
Hayır, optional chaining atama ifadesinin sol tarafında kullanılamaz, bu bir derleme hatası oluşturur. Optional chaining, yalnızca okuma sırasında çalışır, yazımda değil.
Nesne tanımlı değilse yöntemi çağırmak için optional chaining'den yararlanabilir miyim? Örneğin: user?.logInfo()?
Evet, çağrı noktasına kadar nesne undefined/null olabilir, bu durumda user?.logInfo() hata fırlatmaz ve kullanıcı tanımlı değilse sadece undefined döner.
user?.logInfo(); // eğer kullanıcı tanımlıysa, logInfo çağrılacak, aksi takdirde hiçbir şey olmayacak
Optional chaining ile eski stil '&&' operatörü arasındaki fark nedir, örneğin: user && user.address && user.address.city?
Optional chaining daha kısadır, tüm tiplerle (yöntemler ve diziler dahil) çalışır ve TypeScript bunu tür kontrolünde dikkate alır. Ayrıca, '&&' operatörünü kullanırken, istemeden true/false veya undefined yerine iç içe geçmiş bir değer alabilirsiniz. Optional chaining ise ya beklenen türü ya da undefined verir, bu da tür çıkışıyla dikkate alınır.
undefined/null olamayacak değişkenlere erişirken kullanmak (gereksiz ve işe yaramaz kod).Kodda, iş mantığı gereği her zaman tanımlı olan değişkenlerde bile uzun optional chaining zincirleri kullanılıyor:
order?.customer?.address?.city = 'London';
Artıları:
Eksileri:
Sadece dış verilere erişimde veya gerçekten tanımsız olma ihtimali olan yerlerde optional chaining kullanılıyor:
const city = apiResponse?.info?.location?.city || 'Unknown';
Artıları:
Eksileri: