TypeScriptIntermedio6 nov 2025
¡La Caja de Pandora de TypeScript: `interface {}` lo traga TODO!
snippet.typescript
interface AnyNonNullableValue {}
function processValue(val: AnyNonNullableValue): string {
if (typeof val === 'string') {
return `Es un string: "${val}"`;
} else if (typeof val === 'number') {
return `Es un número: ${val}`;
} else if (typeof val === 'boolean') {
return `Es un booleano: ${val}`;
} else if (typeof val === 'object' && val !== null) {
return `Es un objeto de algún tipo: ${JSON.stringify(val)}`;
}
return `Tipo desconocido o null: ${val}`;
}
console.log(processValue("Hola mundo"));
console.log(processValue(123));
console.log(processValue(true));
console.log(processValue({ a: 1, b: "x" }));
console.log(processValue([1, 2, 3]));¿Qué crees que imprime?
✅ Salida Esperada
Es un objeto de algún tipo: "Hola mundo" (o error de tipo)
Es un objeto de algún tipo: 123 (o error de tipo)
Es un objeto de algún tipo: true (o error de tipo)
Es un objeto de algún tipo: {"a":1,"b":"x"}
Es un objeto de algún tipo: [1,2,3]⚠️ Salida Real
Es un string: "Hola mundo"
Es un número: 123
Es un booleano: true
Es un objeto de algún tipo: {"a":1,"b":"x"}
Es un objeto de algún tipo: [1,2,3]¿Por qué pasa esto?
¡Agarraos fuerte, devs! 🎢 Hoy descubrimos que `interface {}` en TypeScript no es una caja vacía, ¡es una **aspiradora cósmica**! 🌌 La lógica es que en TypeScript, los tipos son **estructurales**. Esto significa que si un tipo no declara ninguna propiedad, *cualquier* valor que no sea `null` o `undefined` cumple con esa "estructura" vacía. Piensa en `interface {}` como un club con un único requisito: "no ser invisible (null/undefined)". ¿Eres un string? ¡Adelante! ¿Un número? ¡Bienvenido! ¿Un objeto? ¡Pasa sin problema! 🎩 Es como pedir una "caja" y que te den un agujero negro que acepta de todo menos el vacío absoluto. Usa `object` si realmente quieres solo objetos no primitivos, o `Record<string, unknown>` para objetos con propiedades.
Conceptos relacionados
structural-typingtype-systemempty-types