Declaration Merging, TypeScript'in benzersiz bir özelliğidir ve aynı isimli birden fazla deklarasyonu bir varlıkta birleştirmeye olanak tanır. Bu, TypeScript'in JavaScript üzerindeki tiplendirme geçmişiyle ilgilidir: birçok üçüncü taraf kütüphane arayüzler, fonksiyonlar, ad alanları tanımladı ve TypeScript, bu kütüphanelerin kaynak kodunu değiştirmeden genişletilmesine izin vermek zorundaydı.
Karmaşık API'lerde ve üçüncü taraf JS kütüphanelerinin tiplendirilmesinde, sorumluluğun bölünmesi gerekebilir — örneğin, bir modülün türlerini genişletmek, arayüze alanlar eklemek, isimleri birleştirmek. Ancak çoğu dil bu tür bir deklarasyon birleştirmesini desteklemez.
TypeScript, aynı isimli arayüzlerin, ad alanlarının (namespace), fonksiyonların ve sınıfların bildirimlerini birleştirmeye (merge) izin verir, bu da API'yi genişletmek için esnek hale getirir. Bu, üçüncü taraf türlerini genişletmek, kütüphanelere özel yöntemler eklemek ve ayrıca modüler kod organizasyonu için kullanılır.
Kod örneği:
// arayüzlerin birleştirilmesi interface User { id: number; } interface User { name: string; } const u: User = { id: 1, name: "Jack" }; // ad alanı + fonksiyon birleştirilmesi function greet() { return "Merhaba!"; } namespace greet { export function loud() { return "MERHABA!"; } } greet(); // "Merhaba!" greet.loud(); // "MERHABA!"
Temel özellikler:
Type alias’ları arayüzler gibi birleştirebilir miyiz?
Hayır, type alias’lar birleştirilemez. Aynı isimle birden fazla type bildirmeye çalışırsanız derleme hatası alırsınız.
type T = { a: string }; type T = { b: number }; // Hata
TypeScript, arayüz/namespace alanlarını rastgele bir sırayla mı yerleştirir?
Birleştirilmiş yapı her zaman bildirim sırasına göre inşa edilir — eğer aynı isimde özellikler varsa, son bildirim "kazanır".
Arayüzün yöntemleri bir fonksiyonda birleştirilir mi?
Hayır, farklı arayüzlerde aynı isimdeki yöntemler bir fonksiyonda birleştirilmez — eğer imzalar eşleşiyorsa, TypeScript yine de "her iki" varyasyonu uygulamanıza izin vermez.
Şirket, aynı isimli alan için farklı alanlar ve farklı türlerle birlikte global bir Window arayüzünü iki kez tanımlar. Derleme sırasında, derleyici problemi fark etmez, ancak çalıştırmada beklenmedik tür çatışması ortaya çıkar.
Artılar:
Eksiler:
Üçüncü taraf kütüphaneye d.ts dosyası yazılır, burada API arayüzü, kütüphanenin kendisi değiştirilmeden ayrı modüllerle genişletilir, tüm genişletmeler belgelenir, isim politikası Wiki'de tanımlanır.
Artılar:
Eksiler: