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