infer anahtar kelimesi ile birlikte kullanılan Koşullu Türler, karmaşık veri türlerinden türleri çıkarmaya olanak tanır. Klasik bir örnek — bir dizinin eleman türünü çıkarmak:
type ElementType<T> = T extends (infer U)[] ? U : T;
Burada infer U, T dizisinin eleman türünü hesaplamaya olanak tanır. Eğer T bir dizi ise, elemanlarının türü dönecektir, aksi takdirde kendisi T dönecektir.
Nerelerde kullanılır:
Örnek:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
Bir koşullu tür içinde birden fazla infer kullanılabilir mi? TypeScript bu durumu nasıl yorumluyor?
Yanlış cevap:
Doğru cevap:
type FirstArgument<T> = T extends (infer F, ...any[]) => any ? F : never; // Ama fonksiyonlarla daha doğru: type Args<T> = T extends (...args: infer A) => any ? A : never;
Hikaye
Bir geliştirici, bir fonksiyonun döndürdüğü nesnenin tipini elde etmek için bir yöntem yazdı, ancak fonksiyonun Promise döndürebileceğini hesaba katmadı. Sonuç olarak, dönen değer tipi daima Promise<any> oldu, çünkü iç içe bir conditional kullanmadı. Kodun tüm veritabanında yeniden yapılandırılması gerekti.
Hikaye
Projede, iç içe dizileri açmak için genel bir tip tanıtıldı, ancak koşulda son bir else-branch belirtilmeyi unuttular. TypeScript doğru bir hata almadı, ancak bazı durumlarda sonuç never oldu, bu da bazı utility tiplerinin dış kütüphanelerde bozulmasına neden oldu.
Hikaye
Bir arkadaş, büyük bir arayüzün özelliklerinin türlerini çıkarma girişiminde bulundu, ancak bazı özelliklerin kendilerinin union türleri olduğunu hesaba katmadı. Sonuç olarak, beklenmedik union türü kombinasyonları çıktı, derleyici bunu geçiştirdi, ancak mantık hatalı çalıştı.