ProgramlamaFrontend/Fullstack geliştirici

ReturnType<T> tipi TypeScript'te nasıl çalışır, bir fonksiyonun dönüş değerinin tipini manuel olarak çıkarımından ne farkı vardır ve kullanımıyla ilgili riskler/faydalar nelerdir?

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

Cevap.

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:

  • Fonksiyonların dönüş değerinin tipini otomatik olarak çıkarır (generic'ler dahil), kodun kopyalanmasını önler.
  • Fonksiyon veya dönüş değerinin yapısındaki değişiklikler sırasında hata olasılığını azaltır.
  • Fonksiyon aşırı yüklemeleri ile çalışmaz — yalnızca genel (geniş) bir dönüş tipi çıkarır.

Kandırıcı Sorular.

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

Tip Hataları ve Antipattern'ler

  • Aşırı yüklenmiş fonksiyonlarla ReturnType kullanmak beklenmedik tiplere yol açar.
  • ReturnType'ın Promise değerinin dönüş tipini hesaplamadığını unutmak — Awaited veya manuel çalışma gerekir.
  • ReturnType’a tamamen güvenmek, fonksiyonun mantığını değiştirirken diğer kod parçalarının güncellenmesini sağlamaz.

Gerçek Hayat Örneği

Olumsuz Durum

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:

  • Türler okunması kolaydır, manuel olarak ayarlanabilir.

Eksiler:

  • Hızla eskiyebilir, türler ile gerçek API arasında "kayma" oluşur.

Olumlu Durum

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:

  • Minimum tekrar, gerçek uygulama ile tiplenmiş uyum.

Eksiler:

  • Yeni başlayanlar için tip sihirinin anlaşılmasında zorluklar ortaya çıkabilir.