TypeScript'teki kesişim türleri (Intersection Types), tüm kaynak türlerin özelliklerini ve yöntemlerini bir araya getiren bileşik türler oluşturmayı sağlar. Bu, sınıf mirasından aşırıya kaçmadan esnek ve genişletilebilir veri yapıları oluşturmak için güçlü bir araçtır. Yapı, türler arasında & operatörü ile gerçekleştirilir.
TypeScript, ilk sürümlerinden itibaren “veya” anlamında birleşik türleri (|) destekler, ancak genellikle birden fazla bağımsız arayüz ya da türden bir nesne tanımlama ihtiyacı doğar. Bu durumda, kesişim (&) kullanılır — nesne, tüm özellikleriyle tüm arayüzleri karşılamak zorundadır.
Ana zorluklardan biri, kesişen türlerdeki aynı özellik adlarının çakışması, bunların tiplerinin farklı olması ve özel veya korumalı alanları olan sınıflar birleştirildiğinde üretilen bileşik türün geçerliliğidir. Ayrıca, tiplerin kesişimi ile birleşimi (union types) sıkça karıştırılır; bu da derleme sürecinde beklenmedik hatalara veya nesne ile çalışırken sorunlara yol açar.
Kesişim türleri, birleştirilen türlerden tüm özellikleri toplar ve her özellik için adı eşleşen iki türün de aynı olması gerekir. Hem arayüzler hem de type-alias'lar için kullanılır.
interface A { foo: string; } interface B { bar: number; } type AB = A & B; const item: AB = { foo: "merhaba", bar: 123 }; // Doğru
Eğer kesişen özellikler aynı isme sahipse, türlerin eşleşmesi gerekir; aksi takdirde hata oluşur:
interface X { val: string; } interface Y { val: number; } // type Z = X & Y; // Hata: val uyumsuzluğu
Anahtar özellikler:
& operatorü, her iki türün tüm özelliklerini birleştirir (arayüzler ve type-alias'lar).Eğer türler kesişiyorsa ve bazı özelliklerin uyumsuz türleri varsa ne olur? (Örneğin, bir özellik string, diğeri number)
Derleme hatası oluşur çünkü bir özellik aynı anda hem string hem de number olamaz.
Özel veya korumalı özelliklere sahip sınıfları kesiştirmek mümkün mü?
Mümkündür, ancak eğer aynı isimde ve farklı erişim türlerine sahip alanlar varsa, sonuç geçersiz olur ve TypeScript hata verir.
Kesişim türü, birleşim türünden (|) neyle farklıdır?
Kesişim (A & B), nesnenin her iki türün de özelliği olması gerektiğini gerektirirken, birleşim (A | B) ise en az birinin özelliği olması gerektiğini belirtir. Örneğin:
type U = A | B; // foo veya bar veya her ikisi de olabilir type I = A & B; // Zorunlu olarak her iki özellik de olmalı
Geliştirici, birden fazla uyumsuz arayüzden bir tür oluşturarak; özellikler çatışır ve hata ayıklaması zor hatalar oluşur.
Artılar: Birden fazla türün işlevlerini hızla birleştirme imkanı
Eksiler: Kod derlenmez veya örtük hatalar içerir, hata ayıklama zordur
Fonksiyonların bağımsız arayüzlere ayrılması ve kesişim türü aracılığıyla dikkatlice birleştirilmesi, sonunda bileşik nesneler oluşturur.
Artılar: Ölçeklenebilirlik, test etmenin ve genişletmenin kolaylığı, katı sözleşme
Eksiler: Arayüzlerin tasarlanması ve uzlaştırılması için ek çalışma