Declaration Merging is een unieke eigenschap van TypeScript die het mogelijk maakt om meerdere declaraties met dezelfde namen te combineren tot één entiteit. Dit is gerelateerd aan de geschiedenis van TypeScript als type boven JavaScript: veel externe bibliotheken declareerden interfaces, functies en namespaces, en TypeScript moest toestaan dat ze werden uitgebreid zonder de oorspronkelijke bibliotheekcode te wijzigen.
In complexe API's en bij het typeren van externe JS-bibliotheken kan het nodig zijn om verantwoordelijkheden te scheiden — bijvoorbeeld om de types van een module uit te breiden, velden aan een interface toe te voegen of namen te combineren. De meeste programmeertalen ondersteunen echter geen dergelijke combinatie van declaraties.
TypeScript stelt gebruikers in staat om declaraties van interfaces, namespaces, functies en klassen met dezelfde namen te combineren, wat API's flexibel maakt voor uitbreiding. Het wordt gebruikt voor het uitbreiden van externe types, het toevoegen van aangepaste methoden aan bibliotheken, en ook voor het organiseren van modulaire code.
Code voorbeeld:
// interfaces merging interface User { id: number; } interface User { name: string; } const u: User = { id: 1, name: "Jack" }; // namespace + function merging function greet() { return "Hi!"; } namespace greet { export function loud() { return "HI!"; } } greet(); // "Hi!" greet.loud(); // "HI!"
Belangrijke kenmerken:
Kun je type alias op dezelfde manier combineren als interfaces?
Nee, type alias kunnen niet worden gecombineerd. Bij het proberen om meerdere types met dezelfde naam te declareren zal er een compilatiefout optreden.
type T = { a: string }; type T = { b: number }; // Fout
Zal TypeScript de velden van de interface/namespace in willekeurige volgorde invoegen?
De samengevoegde structuur wordt altijd opgebouwd in de volgorde van declaratie — als er gelijke namen van eigenschappen zijn, 'wint' de laatste declaratie.
Worden de methoden van de interface samengevoegd tot één functie?
Nee, methoden met dezelfde namen in verschillende interfaces worden niet samengevoegd tot één functie — als de handtekeningen overeenkomen, zal TypeScript nog steeds niet toestaan om "beide" varianten te implementeren.
Een bedrijf definieert tweemaal een globale interface Window met verschillende velden en verschillende types voor velden met dezelfde naam. Tijdens de bouw merkt de bouwer het probleem niet op, maar tijdens het uitvoeren ontstaat er een onverwacht typeconflict.
Voordelen:
Nadelen:
Er wordt een d.ts-bestand geschreven voor een externe bibliotheek, waarbij de interface API wordt uitgebreid met afzonderlijke modules zonder de bibliotheek zelf te wijzigen, alle uitbreidingen zijn gedocumenteerd, de naamgevingspolicy is beschreven in de Wiki.
Voordelen:
Nadelen: