Soru Tarihi
TypeScript’in gelişimi ile birlikte, özellikle birbirleriyle bağlantılı birçok fonksiyon bulunan büyük projelerde, bir fonksiyonun dönüş değerinin tipini otomatik olarak çıkarmak ihtiyacı doğmuştur. Bunu yapmak için, TypeScript 2.8 sürümünden itibaren standart kütüphaneye eklenen ReturnType<T> yardımcı tipi tanıtılmıştır.
Sorun
Büyük ve karmaşık projelerde, tiplerin güncelliğini korumak zor olabiliyor — eğer her fonksiyonun dönüş değerinin tipi manuel olarak belirtilirse ve ardından imzalarda bir değişiklik yapılırsa, imzalarla uygulamalar arasında tutarsızlık alınması kolaydır. Ayrıca, bir fonksiyon karmaşık bir yapı döndürüyorsa, dönüş tipinin tanımını tüm kullanım yerlerinde manuel olarak senkronize etmek her zaman kolay olmayabilir.
Çözüm
ReturnType<T> yardımcı tipi, fonksiyonların dönüş tipini otomatik olarak çıkarır ve bu, bir fonksiyon çağrısının sonucunu kodun herhangi bir yerinde tip vermek için kullanılabilir. Bu, tip altyapısının manuel olarak desteklenmesi gereken miktarı azaltır ve tanımlanan ve gerçek dönüş değerinin tipi arasındaki uyumsuzlukla ilgili hataları minimize eder.
Kod örneği:
function createUser(name: string, age: number) { return { name, age, created: new Date() }; } type User = ReturnType<typeof createUser>; // User: { name: string; age: number; created: Date; }
Anahtar özellikler:
ReturnType sınıf metotları ile kullanılabilir mi?
Evet, ancak bağlama dikkat etmek önemlidir: eğer metot, bir fonksiyon olan bir nesnenin özelliği ise, ReturnType<obj['metot']> kullanın.
Kod örneği:
class MyClass { foo(x: number) { return x * 2; } } type FooReturn = ReturnType<MyClass['foo']>; // Tip hatası! // Şu şekilde olmalı: type FooReturn = ReturnType<(x: number) => number>; // number // Veya metodu bir fonksiyon olarak çıkarın: const obj = new MyClass(); type FooReturn2 = ReturnType<typeof obj.foo>;
ReturnType void/never olan fonksiyonlar için ne döndürecek?
Void olarak belirlenmiş bir fonksiyon için ReturnType void döndürecektir. Never için — never.
Kod örneği:
function doNothing(): void {} type Result = ReturnType<typeof doNothing>; // void
ReturnType aşırı yüklenmiş fonksiyonlarla çalışır mı?
Hayır, ReturnType, aşırı yüklemelerin değil, yalnızca "uygulamanın" dönüş tipini çıkarır. Birden fazla aşırı yükleme varsa, uygulama tipini alır.
Kod örneği:
function func(x: number): number; function func(x: string): string; function func(x: any): any { return x } type RT = ReturnType<typeof func>; // any
Bir projede, bir fonksiyonun dönüş birçok nesnesi için manuel bir tür tanımlanır. Fonksiyon değiştiğinde — tür güncellenmez, çağrılar çalışma zamanında hata alır.
Artılar:
Eksiler:
Fonksiyondan dönen değeri kullandıkları her yerde ReturnType'a geçilir. Değişiklik durumunda tür her zaman günceldir.
Artılar:
Eksiler: