Lecciones del módulo (2/2)
Declaraciones y Merging
Los archivos de declaración de tipo (con extensión .d.ts) se utilizan en TypeScript para describir la forma del código JavaScript existente sin implementar ninguna lógica real. Solo contienen definiciones de tipos, interfaces y firmas de funciones.
Estos archivos son fundamentales cuando usamos librerías de terceros escritas en JavaScript puro.
Declaration Merging (Fusión de Declaraciones)
El Declaration Merging es un comportamiento en el que el compilador une dos o más definiciones distintas con el mismo nombre en una sola definición.
El caso más común es la fusión de interfaces:
interface User {
name: string;
}
interface User {
age: number;
}
// ¡La interfaz resultante User posee tanto name como age!
const student: User = {
name: 'Alice',
age: 23,
};Si las propiedades tienen el mismo nombre, deben ser del mismo tipo; de lo contrario, TypeScript informará de un error.
Modificar módulos globales y externos
Podemos usar el declaration merging para extender interfaces definidas en otros módulos o en el ámbito global.
Por ejemplo, si queremos añadir una propiedad al objeto global window del navegador:
declare global {
interface Window {
analyticsToken: string;
}
}Usando declare global, le indicamos a TypeScript que estamos insertando una nueva firma dentro de la interfaz Window que ya existe a nivel global.
Pruébalo tú mismo
Ejercicio 1: Fusión de declaraciones básica
En TypeScript, las interfaces con el mismo nombre en el mismo ámbito se fusionan automáticamente. Declara una interfaz User con la propiedad name: string, luego en un segundo bloque declara la misma interfaz User añadiendo la propiedad age: number. Finalmente, declara una constante user de tipo User con los valores apropiados.
Mostrar pista
Declara dos veces interface User insertando las respectivas propiedades y luego asigna los campos al objeto user.
Solución disponible después de 3 intentos
Ejercicio 2: Extensión de la interfaz global Window
Imagina que quieres extender la interfaz global Window para añadir una propiedad personalizada llamada config de tipo Record<string, string>. Escribe la declaración correcta usando declare global para fusionar la nueva propiedad en la interfaz Window global.
Mostrar pista
Usa declare global { interface Window { config: Record<string, string>; } }.
Solución disponible después de 3 intentos