ReturnType<T> ve Parameters<T> — TypeScript'in utility tipleridir, bu türler bir fonksiyonun döndürülen değerinin türünü (ReturnType) veya parametrelerinin türlerinin dizisini (Parameters) otomatik olarak çıkarmaya izin verir.
Bu, uygulamanın farklı bölümleri arasındaki türlerin tutarlılığını sağlamak ve generic sarıcıların uygulanması için özellikle kullanışlıdır.
Kullanım örneği:
function fn(a: number, b: string): boolean { return b.length > a; } type FnReturn = ReturnType<typeof fn>; // boolean type FnParams = Parameters<typeof fn>; // [number, string]
Fonksiyon aşırı yüklenmesi ile ilgili nüanslar: Fonksiyon aşırı yüklenmesi durumunda ReturnType, son imza türünü belirler, Parameters ise tüm olası aşırı yüklemeleri belirtir:
function overloaded(x: number): number; function overloaded(x: string): string; function overloaded(x: any): any { return x; } type OverRet = ReturnType<typeof overloaded>; // any type OverParams = Parameters<typeof overloaded>; // [any]
Yani, utility tiplerin türlendirilmesi her zaman tüm aşırı yüklemeleri "göremez", bu nedenle statik türlendirme daha az öngörülebilir hale gelir.
ReturnType ve Parameters kullanarak her aşırı yüklemenin türünü ayrı ayrı tanımlamak mümkün mü?
Cevap:
Hayır. Utility tipler ReturnType ve Parameters yalnızca fonksiyonun "birleşik" imzasını analiz eder — uygulama için nasıl tanımlandığı. Her bireysel aşırı yüklemenin türünü almak mümkün değildir — yalnızca nihai uygulanan imzayı elde edebiliriz.
Örnek:
type P = Parameters<typeof overloaded>; // [any], değil [number], [string]
Hikaye
Geliştiriciler, ReturnType<T> kullanarak döndürülen değerin türünü tiplendirmek için aroundMethod adında bir sarıcı yazdılar. Ancak bu sarıcı aşırı yüklenmiş bir fonksiyona uygulanıyordu. Sonuç: tipler çok genel (any) oldu ve derleyici hata durumunda döndürülen değerlerin uyumsuzluğuna dair uyarı vermedi. Boolean yerine string ile çalışırken hatayı geç fark ettiler.
Hikaye
Bir dizi API fonksiyonunun parametrelerini Parameters<T> ile çıkarmaya çalışan geliştirici, yöntemlerin aşırı yüklenmelerini hesaba katmadı. Bu, [string, number] yerine [any] beklenirken "hatalı" türlerle ilgili bir sorun ortaya çıkardı. Birim testleri bu hatayı yakalayamadı çünkü uygulamaya göre montaj yapıldı ve API'nin gerçek kullanıcıları üretim ortamında hatalar yaşadılar.
Hikaye
Büyük bir kodu JavaScript'ten TypeScript'e taşırken, geliştiriciler her şeyi ReturnType ile tiplendirdiler. Daha sonra uygulamanın aşırı yüklemelerin beyannamesinden çok farklı olduğunu fark ettiler. Bu nedenle hatalı argümanlarla senaryolar beklenmedik runtime istisnaları (örneğin, TypeError: x tanımsız) meydana getirdi.