Koşullu Türler (conditional types) TypeScript'te bir türü başka bir tür üzerinden tanımlamak için T extends U ? X : Y prensibini kullanır. Bu türler, özellikle kütüphanelerde ve API deklarasyonlarında karmaşık tür mantığı oluşturulurken büyük olanaklar sunar.
Temel bir koşullu tür örneği:
type IsString<T> = T extends string ? 'evet' : 'hayır'; type A = IsString<string>; // 'evet' type B = IsString<number>; // 'hayır'
Eğer koşullu tür bir union-türüne uygulanıyorsa, TypeScript koşulu her bir union elemanına ayrı ayrı "dağıtır". Bu, koşullu türlerin dağıtım davranışı olarak adlandırılır.
Örnek:
type Foo<T> = T extends { id: number } ? string : boolean; type Result = Foo<{id: number} | {name: string}>; // string | boolean
Bu çok güçlü bir özellik, ancak özellikle dizilerle ve tür haritalama ile çalışırken beklenen sonuçta kafa karışıklığına yol açabilir.
Türü bir tuple içine sararak:
type NoDistrib<T> = [T] extends [{id: number}] ? string : boolean; type Result = NoDistrib<{id: number} | {name: string}>; // boolean
Soru: "Union türleri ile koşullu bir tür kullanırsanız, tuple'lara sarmaksızın ne olur? Sonuç her zaman, normal mantıkla aynı mıdır?"
Cevap: Sonuç beklenmedik olabilir! Dağıtım nedeniyle, koşul her bir union türü üyesine ayrı ayrı uygulanır. Tüm union türünü sıkı bir şekilde karşılaştırmak için bir sarmaya (tuple) ihtiyaç vardır.
Örnek:
type Test<T> = T extends string ? number : boolean; type A = Test<string | boolean>; // number | boolean, sadece boolean değil
Hikaye
Serileştirme kütüphanesinde, veri yapısının kontrolü için bir koşullu tür kullanıldı, ancak generic parametre tuple'a sarılmayı unuttular. Sonuç olarak, karmaşık union türlerinde deklarasyonlar bozuldu ve derleyici API kullanımı sırasında öngörülemeyen türler verdi.
Hikaye
Model alanlarını işlemek için tür dönüşümünü gerçekleştirmeye çalışırken, dağıtım nedeniyle bilgi kaybı yaşandı: bazı mantık yollarını unuttukları için türleme çok izni alıcı hale geldi.
Hikaye
Geliştirici, T extends SomeType içindeki koşullu türlerin tüm nesne için beklediğimiz gibi davranacağını düşünüyordu, ancak "dağılım" oldu - derleyici, tutarsızlığı işaret etti ve tür karışıklığı ile otomatik belgelendirme oluşturma sırasında ciddi hatalar başladı.