Declaration merging is TypeScript dat meerdere declaraties met dezelfde naam combineert tot een enkele definitie. Interfaces, namespaces en enkele andere constructies mergen automatisch.
Interface merging
interface Box { : ; }
{ : ; }
Declaration merging is TypeScript dat meerdere declaraties met dezelfde naam combineert tot een enkele definitie. Interfaces, namespaces en enkele andere constructies mergen automatisch.
interface Box { : ; }
{ : ; }
So voeg je typen toe aan bibliotheken of globals die je niet bezit:
// Add a custom property to Express's Request
declare global {
namespace Express {
interface Request { user?: { id: string }; } // merges into Express.Request
}
}
request.user; // ✅ now typed everywhere
// Augment a module
declare module "some-lib" {
interface Options { newOption: boolean; }
}
Omdat de Request/Options van de bibliotheek een interface is, wordt je declaratie gemergd in plaats van conflicterend — zodat je veilig typen kunt uitbreiden die je niet kunt bewerken.
function greet() {}
namespace greet { export const version = "1.0"; }
greet.version; // "1.0" — namespace merged onto the function
type dit niet kan doentype A = { x: number };
type A = { y: number }; // ❌ Error: duplicate identifier
Type aliases zijn uniek; alleen interfaces (en namespaces) mergen — een belangrijke reden om interface te gebruiken voor uitbreidbare public API shapes.
Declaration merging is het mechanisme achter module augmentation — Express requests uitbreiden, toepassingen toevoegen aan window, bibliotheektypen aanpassen, themingsystemen.
Het is essentiële kennis voor het typen van echte apps waar je typen die je niet beheert moet aanpassen, zonder ze te forken.