Soru Tarihi:
TypeScript, Java veya C# gibi diğer sıkı tipli diller gibi yöntem aşırı yüklemesini destekler, ancak TypeScript'teki aşırı yükleme söz dizimi kavramsal olarak farklıdır. Burada birden fazla imza izin verilir, ancak sadece bir uygulama vardır. Bu, klasik aşırı yüklemeyle tanışık geliştiriciler için kafa karıştırıcı olabilir.
Sorun:
Yaygın bir hata, farklı parametre setleri ile birden fazla yöntem tanımlamaya çalışmaktır. Sonuç olarak bir derleme hatası meydana gelir, çünkü TypeScript, tüm imza varyantlarını uygulayan bir tane uygulanmasını zorunlu kılar.
Çözüm:
Aşırı yükleme, birden fazla yöntem imzası ilan edilerek ve ardından tüm seçeneklere karşılık gelen bir uygulama yapılarak gerçekleştirilir. Parametreleri doğru bir şekilde ayırt etmek için genellikle type guards veya instanceof kullanılır.
Kod örneği:
class MyLogger { log(message: string): void; log(message: string, level: 'info' | 'error'): void; log(message: string, level?: 'info' | 'error'): void { const lvl = level ?? 'info'; console.log(`[${lvl}] ${message}`); } }
Anahtar Özellikler:
Farklı parametre setleri ile bir yöntemin iki uygulanması gerçekleştirilebilir mi?
Hayır. TypeScript'te sadece bir uygulamaya izin verilir. Aynı adı taşıyan birden fazla yöntem, sözdizim hatasıdır.
Aşırı yükleme sırasında rest-parametrelerini nasıl tiplendirebiliriz, böylece katı tip kontrolünü kaybetmeyiz?
İmzaların kesin parametreleri tanımlanması, ve uygulamada mümkün olduğunca genel olanların kullanılması önerilir:
class Test { doWork(a: number): void; doWork(a: string): void; doWork(a: number | string): void { //... } }
Eğer aşırı yüklenmiş imzaların dönüş türleri farklıysa ne olur?
TypeScript, uygulamanın birleşik bir tür (Union) döndürmesini talep edecektir. Aksi takdirde, derleme hatası çıkar.
class X { get(value: number): string; get(value: string): number; get(value: number | string): string | number { return typeof value === 'number' ? 'number' : 42; } }
Ürün, sınıfta farklı parametre türleri için aynı adı taşıyan iki yöntem uygulamaya çalıştı. Derlemeden sonra, yöntem "son bildirimi" ile değiştirildi, diğer tüm versiyonlar göz ardı edildi ve hatalar ortaya çıktı.
Artılar:
Eksiler:
Union-type parametreleri ile birkaç imza yapıldı ve yöntemde tüm seçenekler type guards ile işlendi. Derleyici hemen tip sorunları hakkında uyardı.
Artılar:
Eksiler: