ProgramlamaBackend Geliştirici

TypeScript'te sınıflarda yöntem aşırı yüklemesi nasıl gerçekleştirilir, aşırı yüklenmiş yöntemler yazarken hangi hatalardan kaçınılmalıdır ve tip kontrolü ile ilgili hangi inceliklerle karşılaşılabilir?

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

Cevap.

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:

  • Sadece bir yöntem uygulanması, ancak birden fazla imza bildirimi
  • Uygulama içinde tüm parametre seçeneklerinin işlenmesini sağlamak gerekir
  • Uygulamadaki tipler mümkün olduğunca geniş olmalıdır

İkna Edici Sorular.

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; } }

Tipik Hatalar ve Anti-Desenler

  • Uygulamanın aşırı yükleme imzalarına uymaması
  • Bir yöntemin birden fazla ayrı uygulanması
  • Yöntemin gövdesinde giriş parametrelerinin tip kontrollerinin göz ardı edilmesi

Gerçek Hayattan Bir Örnek

Olumsuz Durum

Ü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:

  • Bazı diller için alışık bir stil

Eksiler:

  • TypeScript'te tam olarak çalışmıyor, derleme hataları
  • Pas geçen durumların artan riski

Olumlu Durum

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:

  • Katı tip kontrolü
  • Güvenlik
  • Test etmenin kolaylığı

Eksiler:

  • Seçeneklerin kontrolü için daha fazla kod gerektirir