La fusión de declaraciones es cuando TypeScript combina múltiples declaraciones con el mismo nombre en una única definición. Las interfaces, los namespaces y algunas otras construcciones se fusionan automáticamente.
Fusión de interfaces
interface Box { width: number; }
interface Box { height: number; }
// Box is now { width: number; height: number } — both merged
El caso de uso estrella: aumentar tipos de terceros / globales
Así es como agregas tipos a librerías o globales que no te pertenecen:
// 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; }
}
Como el Request/Options de la librería es una interface, tu declaración se fusiona con ella en lugar de entrar en conflicto — permitiéndote extender de forma segura tipos que no puedes editar.
Fusión de namespace + función
function greet() {}
namespace greet { export const version = "1.0"; }
greet.version; // "1.0" — namespace merged onto the function
Por qué type no puede hacer esto
type A = { x: number };
type A = { y: number }; // ❌ Error: duplicate identifier
Los alias de tipo son únicos; solo las interfaces (y los namespaces) se fusionan — una razón clave para usar interface en formas de API públicas y extensibles.
Por qué es importante
La fusión de declaraciones es el mecanismo detrás de la ampliación de módulos (module augmentation) — extender los requests de Express, agregar a window, personalizar tipos de librerías, sistemas de temas.
Es un conocimiento esencial para tipar aplicaciones reales donde debes adaptar tipos que no controlas, sin necesidad de hacer un fork de ellos.
