ProgramlamaTypeScript mimarı

TypeScript'te koşullu türler nasıl çalışır? Koşullu türlerin dağıtım davranışı nedir ve bununla nasıl çalışılır? Örneklerle açıklayınız.

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

Cevap.

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'

Dağıtım Davranışı

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.

Dağıtım Davranışını Önleme

Türü bir tuple içine sararak:

type NoDistrib<T> = [T] extends [{id: number}] ? string : boolean; type Result = NoDistrib<{id: number} | {name: string}>; // boolean

Soktu soru.

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

Bilinçsizlik nedeniyle gerçek hatalara dair örnekler.


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ı.