ProgramlamaTypescript geliştirici

TypeScript'te Declaration Merging mekanizmasını anlatın. Arayüzler, fonksiyonlar ve ad alanları (namespace) için nasıl çalışır ve burada hangi tuzaklar vardır?

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

Cevap.

Declaration Merging (deklarasyon birleştirme) - TypeScript'in, aynı isimdeki deklarasyonları tek bir tür/varlıkta birleştirmeye olanak tanıyan eşsiz bir mekanizmasıdır. Bu, arayüzler, ad alanları ve fonksiyonlar için çalışır.

  1. Arayüzler: aynı isimdeki arayüz deklarasyonları büyük bir arayüzde birleştirilir:
interface User { name: string; } interface User { age: number; } const u: User = { name: 'Vasya', age: 42 }; // TAMAM
  1. Fonksiyon + namespace: aynı isimdeki bir fonksiyon ve ad alanı birleştirilir - statik yöntemler bir araya gelir:
function helper() {} namespace helper { export function extra() {} } helper.extra(); // TAMAM
  1. Namespace + enum ve namespace + class: sınıfların ve enum'ların statik özellikleri ile genişletilmesi için birleştirme de mümkündür.

Tuzağı olan soru.

Farklı arayüz alanlarında aynı isme sahip yöntemlerin birleştirilmesi nasıl olur ve eğer imzaları farklıysa ne olur?

Cevap:

Eğer farklı birleştirilmiş arayüzlerde aynı isme sahip yöntemler ilan ederseniz, TypeScript bu yöntemleri nihai arayüzde "aşırı yüklemek" için çaba gösterecektir. Ancak, eğer imzalar uyumsuzsa (aşırı yükleme yapılamazsa), bu bir derleme hatasına yol açar.

Örnek:

interface Foo { bar(a: number): void } interface Foo { bar(a: string): void } // TAMAM: aşırı yüklemeler interface Foo { bar(a: number[]): void } // HATA: uyumsuz imzalar

Gerçek hatalardan örnekler


Hikaye

Bir projede, farklı özellikler için declaration merging aracılığıyla dış bir arayüzü Window'u genişletiyorduk: bir ekip window.myFeature: boolean ekledi, diğeri window.myFeature: number ekledi. Merge bir tür hatası oluşturdu ve derleyici çelişkiyi ancak genel derlemede yakaladı - birinin hızlıca yeniden adlandırma yapması gerekti.


Hikaye

İki farklı yöntem imzasına sahip iki ArrayHelper arayüzü hatayla ilan edildi ve "her iki seçenek mevcut" olmasını bekledik. Gerçekte ilk imza ikinciyi geçersiz kıldı ve bu, IDE'de yanlış otomatik tamamlama ile yeni bir modül ile entegrasyonda bir hataya yol açtı.


Hikaye

Bir fonksiyonu declaration merging aracılığıyla "genişletme" için bir ad alanı kullanırken, geliştirici yanlışlıkla namespace içinde export'u ilan etti ve fonksiyon ulaşılamaz hale geldi. Sadece incelemeden sonra, doğru export olmadan merge'in çalışmadığı ve özelliklerin fonksiyona eklenmediği anlaşıldı.