ProgramlamaFullstack geliştirici

TypeScript'te yapısal tip uyumluluğu (Structural typing) nasıl çalışır? Nominal tiplemeden farkı nedir, gücü nedir ve karşılaşılabilecek tuzaklar nelerdir?

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

Cevap.

Konunun Tarihi

Birçok nesneye dayalı dille karşılaştırıldığında, TypeScript yapısal tiplemeyi (duck typing) uygular: Bir nesne, gerekli tüm özelliklere sahipse, bu türde kabul edilir; türün açıkça tanımlanıp tanımlanmadığına bakılmaksızın.

Sorun

Bu esneklik, bazen yapının uyuştuğu durumlarda nesnelerin tür olarak yanlış kabul edilmesine yol açabilir, oysa aslında anlam açısından bağlantılı değillerdir. Bu, yapının tesadüfen eşleştiği karmaşık veri modellerinde tehlikeli olabilir.

Çözüm

Nesne türlerini her zaman doğru yapılandırın, farklı varlıkların yapısal uyuşumlarını en aza indirin, kritik durumlarda türleri "nominalleştirmek" için ek özellikler veya semboller kullanın.

Kod örneği:

interface Point { x: number; y: number; } interface Pixel { x: number; y: number; } function drawPoint(p: Point) { console.log(p.x, p.y); } const pixel: Pixel = { x: 1, y: 2 }; drawPoint(pixel); // TAMAM, türler yapısal olarak uyumlu

Ana özellikler:

  • Yapıya dayalı (özellikler ve türleri) kontrol, tür adına göre değil
  • Mevcut JS koduyla kolay entegrasyon
  • Anlam açısından farklı nesnelerin yapı uyuşmazlıklarında potansiyel çatışmalar

Tuzak Sorular.

İki arayüzün yapısı uyuşuyorsa, bu onların tamamen birbirinin yerini alabileceği anlamına mı gelir?

Yapı itibarıyla öyle olabilir, ama programın mantığı açısından değil. Bu, derleyici düzeyinde kabul edilebilir, ancak mantıksal hatalara yol açabilir (örneğin, yukarıdaki Point ve Pixel).

Bir tür için yapısal uyumluluğu yasaklamak mümkün mü?

Tamamen hayır, ancak benzersiz bir özellik ekleyebilirsiniz (örneğin, sembolle):

interface Brand { _brand: unique symbol; }

Artık başka bir nesne bu türü taklit edemez, aynı benzersiz sembol olmadan.

Yapısal tipleme, nominal tiplemeden nasıl farklıdır?

Yapısal — yapının varlığına, nominal — belirli bir namespace'deki tür adının uyuşumuna dayanır. TS'de varsayılan olarak her zaman yapısal tipleme vardır.

Tür Hataları ve Anti-Desenler

  • Aynı yapıya sahip alakasız nesnelerin yanlış kabul edilmesi
  • Tam uyuşumlu imzalar — kavramsal olarak farklı türlerin ayrılmasında zorluk
  • Yanlış bir tür güvenliği hissi

Gerçek Hayattan Örnek

Olumsuz Durum

Bazı nesnelerde yanlışlıkla alanlar uyuştu (örneğin, User ve Admin olarak {id: number, name: string}), bu da API sözleşmeleriyle çalışırken kafa karışıklığına yol açtı.

Artılar:

  • Daha az kod, yeni varlıkları genişletmek daha kolay

Eksiler:

  • Derleyici tarafından yakalanmayan mantıksal hataları izlemek zor

Olumlu Durum

Anlam açısından farklı yapıların ayırt edilmesi için benzersiz "etiketler" ve standart dışı alanlar kullanımı.

Artılar:

  • İş mantığına göre açık ayrım
  • Kavramların ek güvenliği ve netliği

Eksiler:

  • Koda ek karmaşıklık
  • Türlerin daha titiz bir şekilde planlanmasını gerektirir