ProgramlamaFrontend geliştirici

TypeScript'te tür daraltma (Type Narrowing) mekanizmasını açıklayın. Değişken türlerini daraltmanın yolları nelerdir, bu ne amaçla kullanılır?

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

Cevap.

Tür daraltma (Type Narrowing) TypeScript'te, derleyicinin belirli bir kod bölümünde bir değişkenin, koşullara dayanarak açıkça daha belirli bir türe sahip olduğunu "anladığı" süreçtir.

Tipik daraltma teknikleri:

  • typeof operatörü ile kontrol:
function example(x: number | string) { if (typeof x === 'string') { // burada x: string return x.toUpperCase(); } else { // burada x: number return x.toFixed(2); } }
  • instanceof ile kontrol (sınıflar için):
if (dateObj instanceof Date) { // dateObj: Date }
  • null ve undefined üzerinde kontrol:
function print(value?: string) { if (value != null) { // value: string console.log(value.length); } }
  • "discriminant properties" (ayırıcı özellikler) ile kontrol:
type Pet = { kind: 'dog'; woof: () => void } | { kind: 'cat'; meow: () => void }; function sound(pet: Pet) { if (pet.kind === 'dog') { pet.woof(); } else { pet.meow(); } }

TypeScript ayrıca kullanıcı tanımlı predikat fonksiyonlarını da destekler:

function isString(x: unknown): x is string { return typeof x === 'string'; }

Daraltma, tür kontrollerini daha güvenli hale getirir ve kodu daha güvenilir kılar.

Sıcak bir soru.

Basit karşılaştırmalar (örn. ==/===) ile tür daraltmanın garanti edilip edilemeyeceği ve her zaman çalışıp çalışmadığı.

Cevap: Hayır. TypeScript her durumda basit karşılaştırmalardan türü anlamaz, özellikle karşılaştırma çok "bulanık" olduğunda veya dolaylı değişkenler/özellikler üzerinden yapıldığında. Daraltma için sıklıkla açık mekanikler (typeof, instanceof, ayırıcı özellikler ve type guard'lar) kullanmak gerekir.

Örnek:

function foo(x: number | string | null) { if (x) { // x: string | number, null artık mümkün değil, ancak kesin bir tür daraltma olmayacak } }

Hikaye

Büyük bir TypeScript projesinde user.role == 'admin' türü daraltmadı ve yine de özelliklerin varlığı için kontroller eklemek gerekiyordu. Geliştiriciler daraltma kurallarını hafife almışlardı, bu da "Cannot read property ... of undefined" hatalarına yol açtı.


Hikaye

Mobil uygulamada bir fonksiyon ya bir nesne ya da bir dize alıyordu. Türü değiştiren dolaylı bir fonksiyon çağrısı ile daraltma gerçekleşmedi ve bazı cihazlarda dizeye ait olmayan bir metodun çağrılmasında çökme meydana geldi. Nadir durumlarda testler başarısız oldu.


Hikaye

JavaScript'ten TypeScript'e geçişte kendi tür koruma fonksiyonları uygulanmadı, özelliklerle yapılan kontrollerin türü her zaman daraltacağı varsayıldı. Sonuç olarak opsiyonel alanlara sahip karmaşık nesneler yanlış davrandı ve çalıştırma zamanı veri erişiminde öngörülemeyen hatalar oluştu.