TypeScriptIntermedio23 oct 2025

El Misterio de la Propiedad 'Nunca': Intersecciones Imposibles

snippet.typescript
type UserPreferences = {
  theme: "dark" | "light";
  fontSize: number;
};

type AdminSettings = {
  theme: "admin" | "corporate";
  maxUsers: number;
};

type AdvancedUserAdmin = UserPreferences & AdminSettings;

const settings: AdvancedUserAdmin = {
  theme: "dark", // ¡WTF! Esto causa un error de compilación
  fontSize: 16,
  maxUsers: 100,
};

¿Qué crees que imprime?

Salida Esperada

Uno esperaría que la propiedad `theme` fuese un tipo de unión (ej. `"dark" | "light" | "admin" | "corporate"`), o que TypeScript emitiera un error en la definición del tipo `AdvancedUserAdmin` por el conflicto.

⚠️ Salida Real

Error de compilación de TypeScript:
`Type '"dark"' is not assignable to type 'never'.`

¿Por qué pasa esto?

Cuando los **tipos de intersección** (`&`) de TypeScript se encuentran con propiedades con el mismo nombre pero **tipos incompatibles**, ¡la cosa se pone salvaje! Imagina a dos arquitectos geniales diseñando una casa. Uno dice que la puerta principal debe ser un `string` ("roble", "cristal"), el otro insiste en que debe ser un `number` (`1` para sólida, `2` para hueca). 🤯 TypeScript, en su infinita sabiduría (y estrictez), ve el conflicto y declara: "¡Esta puerta **jamás** podrá existir!" El tipo resultante para esa propiedad se convierte en `never`. Es el tipo inferior, que significa "ningún valor posible puede ser asignado aquí". Así que, cuando intentas asignar `"dark"` a `theme` en `AdvancedUserAdmin`, el compilador grita porque `"dark"` no es `never`. ¡Es como intentar meter un cuadrado en un agujero de "nunca"! 🚫 Esto no es un tema de ejecución; es el **sistema de tipos** levantando las manos ante una intersección imposible. ¡Usa **tipos de unión** (`|`) si quieres opciones, o renombra las propiedades en conflicto!

Conceptos relacionados

type-systemintersection-typesnever-type