ProgramlamaTypescript Geliştiricisi

Fonksiyonların aşırı yüklenmesi (overload) TypeScript'te nasıl çalışır ve diğer dillerdeki yöntem aşırı yüklemesinden farkı nedir?

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

Cevap.

Meselenin Tarihi

Java veya C# gibi dillerde fonksiyonların ve yöntemlerin aşırı yüklenmesi standart bir özellik olarak bulunmaktadır: aynı isimde, ancak farklı parametrelerle birden fazla fonksiyon tanımlanabilir. JavaScript’te bu yoktur, bu da potansiyel hatalar ekler. TypeScript, bu sorunu türler düzeyinde çözmektedir.

Sorun

TypeScript'te gerçek bir aşırı yüklenme (birden fazla uygulama) yoktur. Aynı fonksiyonu birden fazla imza ile tanımlayabilirsiniz, ancak yalnızca bir tane gerçek işlev uygulayabilirsiniz. Hatalar, tanımlanan imzaların ve uygulamanın senkronizasyonun kaybolması veya yanlış imza sıralamasından kaynaklanır.

Çözüm

TypeScript, birden fazla imza ardışık olarak tanımlanarak ve tüm aşırı yüklenme varyantlarıyla uyumlu tek bir gerçek uygulama ile fonksiyonların aşırı yüklenmesini destekler.

Kod örneği:

function sum(a: number, b: number): number; function sum(a: string, b: string): string; function sum(a: any, b: any): any { return a + b; } const a = sum(1, 2); // 3 const b = sum('foo', 'bar'); // "foobar"

Anahtar özellikler:

  • Her zaman tüm imzalardan sonra bir uygulama vardır
  • Uygulama, tüm aşırı yüklenme türleriyle uyumlu olmalıdır
  • TypeScript, aşırı yüklenmiş fonksiyon kullanıldığında çağrının doğruluğunu kontrol eder

Tuzak Sorular.

Aşırı yüklenme imzalarının tamamından önce fonksiyonun uygulamasını tanımlamak mümkün mü?

Hayır, önce aşırı yüklenme imzalarının tümü tanımlanmalı, ardından uygulama gelmelidir. Hata:

// Hata! Önce imzalar, sonra uygulama function foo(a: number): number { return a } // hata function foo(a: string): string { return a } // hata

TypeScript, tüm aşırı yüklenme imzalarında döndürülen değerleri kontrol eder mi?

TypeScript, yalnızca derleme aşamasında tanımlanan imzalara uygun türleri döndürmeyi garanti eder; çalışma sırasında tür kontrolü yapılmaz.

Tek bir uygulamada tüm giriş kombinasyonlarını kapsamak zorunda mı?

Uygulama fonksiyonu, aşırı yüklenme imzalarına göre tüm giriş kombinasyonlarını doğru bir şekilde işlemesi gerekir:

function parse(a: number): string; function parse(a: string): string; function parse(a: number | string): string { return String(a); }

Tipik hatalar ve anti-paternler

  • Uygulama ile aşırı yüklenme imzaları arasındaki uyuşmazlık
  • İmzaların ve uygulamanın yanlış sıralanması
  • Tür kombinasyonlarının örtük işlenmesi/görmezden gelinmesi

Hayattan Bir Örnek

Olumsuz Durum

Farklı giriş türleri ile birden fazla aşırı yüklenme tanımlanmış, ancak uygulama tüm durumları işlememekte ve nadir girişler için çalışma zamanı hatası vermektedir.

Artılar:

  • Fonksiyon kullanıcıları için esnek API

Eksiler:

  • Türler derleniyor ancak fonksiyonun çalışması ek kontrol olmadan hatalı

Olumlu Durum

Her aşırı yüklenme durumu uygulama içinde türler üzerinde bir koşul ile kapsanmaktadır, tür kontrolleri (typeof/instanceof) kullanılmaktadır.

Artılar:

  • API güvenli ve öngörülebilir
  • Hatalar derleme aşamasında yakalanır

Eksiler:

  • Ek kontrol nedeniyle kod tabanını artırır