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.
interface User { name: string; } interface User { age: number; } const u: User = { name: 'Vasya', age: 42 }; // TAMAM
function helper() {} namespace helper { export function extra() {} } helper.extra(); // TAMAM
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
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ı.