TypeScriptIntermedio10 oct 2025
El Secreto de mi Objeto: Cuando el Type Narrowing te Ignora
snippet.typescript
type Status = "ACTIVE" | "INACTIVE";
interface User {
id: number;
status: Status;
name: string;
}
const processActiveUser = (user: { status: "ACTIVE" }) => {
console.log(`🚀 Procesando usuario activo: ${user.name} (ID: ${user.id})`);
};
let currentUser: User = { id: 1, status: "ACTIVE", name: "Alice" };
if (currentUser.status === "ACTIVE") {
processActiveUser(currentUser);
}¿Qué crees que imprime?
✅ Salida Esperada
Uno esperaría que el `if` estreche el tipo de `currentUser` para permitir la llamada a `processActiveUser`, imprimiendo:
🚀 Procesando usuario activo: Alice (ID: 1)⚠️ Salida Real
TypeScript arroja un error de compilación:
Argument of type 'User' is not assignable to parameter of type '{ status: "ACTIVE"; }'.
Types of property 'status' are incompatible.
Type 'Status' is not assignable to type '"ACTIVE"'.
Type '"INACTIVE"' is not assignable to type '"ACTIVE"'.¿Por qué pasa esto?
¡Aquí tenemos un auténtico WTF digno de una película de espías! 🕵️♀️ Tú, con toda la lógica del mundo, compruebas que `currentUser.status` **es** `"ACTIVE"`. Piensas: "¡Genial, TypeScript es inteligente, sabe que el `if` estrecha el tipo, así que puedo pasárselo a `processActiveUser`!".
Pero TypeScript te mira con cara de póker y te dice: "Lo siento, amigo, tu objeto `currentUser` *en su conjunto* sigue siendo del tipo `User`, y `User` dice que `status` puede ser `"ACTIVE"` O `"INACTIVE"`. No me importa lo que acabas de comprobar en una propiedad; el **tipo declarado del objeto completo** es lo que manda aquí. No puedo garantizar que **todo el objeto** se ajuste a `{ status: "ACTIVE" }` solo porque una propiedad lo haga en este instante."
Es como si intentaras pasar un gato 🐱 (tipo `Animal`) por una puerta de "Solo Perros Labradores" 🐶, y le dijeras al portero: "¡Pero mira, este gato *ahora mismo* tiene pelo negro como un Labrador!". El portero te dirá: "Sí, pero sigue siendo un gato. ¡Fuera!". TypeScript no estrecha el tipo del objeto completo, solo la propiedad directamente afectada.
Conceptos relacionados
type-narrowingobject-typestype-inference