Saltar al contenido principal
TypeScript

Solución: Type is not assignable to type en TypeScript

TypeScript detecta una incompatibilidad de tipos entre lo que tienes y lo que se espera. Cómo leer el error, corregir el tipo correcto y cuándo usar 'as' como último recurso.

Error: Type 'X' is not assignable to type 'Y'

¿Por qué ocurre?

TypeScript compara el tipo del valor que asignas con el tipo que se declara (o infiere) para esa variable, prop o parámetro. Si no coinciden estructuralmente, bloquea la compilación. Las causas más frecuentes son: olvidar manejar el caso `undefined`/`null`, pasar un subtipo donde se espera el tipo base, o usar tipos demasiado amplios (any, unknown) sin acotar.

Solución paso a paso

Caso 1 — Posible undefined no contemplado:

// ❌ getElementById puede devolver null
const input = document.getElementById('nombre');
input.value = 'test'; // Error: 'input' is possibly 'null'

// ✅ Opción A: non-null assertion (cuando estás seguro) const input = document.getElementById('nombre')!; input.value = 'test';

// ✅ Opción B: comprobación en tiempo de ejecución (más seguro) const input = document.getElementById('nombre'); if (input instanceof HTMLInputElement) { input.value = 'test'; }

Caso 2 — Tipo incompleto en un objeto:

interface Usuario {
  nombre: string;
  edad: number;
  email: string;
}

// ❌ Falta la propiedad 'email' const u: Usuario = { nombre: 'Ana', edad: 30 }; // Error: Property 'email' is missing

// ✅ Añade la propiedad que falta const u: Usuario = { nombre: 'Ana', edad: 30, email: 'ana@test.com' };

// ✅ O usa Partial si realmente puede estar incompleto const u: Partial = { nombre: 'Ana', edad: 30 };

Caso 3 — Tipos de unión no contemplados:

function procesar(valor: string | number) {
  // ❌ .toUpperCase() no existe en number
  return valor.toUpperCase(); // Error

// ✅ Comprueba el tipo antes if (typeof valor === 'string') return valor.toUpperCase(); return valor.toString().toUpperCase(); }

Caso 4 — Props de componente React con tipos estrictos:

interface Props {
  onClick: () => void;
}

// ❌ El handler recibe un evento, no devuelve void directamente { /* ... */ }} /> // Error: Type '(e: MouseEvent) => void' is not assignable to '() => void'

// ✅ Ajusta el tipo de la prop interface Props { onClick: (e: React.MouseEvent) => void; }

Usar as como último recurso:

// Solo cuando sabes con certeza que el tipo es correcto
// y TypeScript no puede inferirlo
const input = document.getElementById('nombre') as HTMLInputElement;

// ❌ Nunca uses 'as any' para silenciar errores que deberías resolver const dato = respuestaApi as any; // estás desactivando TypeScript

Cómo evitarlo en el futuro

Activa `strict: true` en tsconfig.json desde el inicio del proyecto para detectar estos errores temprano. Evita `any` — si necesitas una válvula de escape, usa `unknown` y haz type guards. Los errores de tipos son bugs reales que TypeScript te está evitando.

TypeScripttiposErrorcasting

¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:

Generador de Prompts

¿Necesitas desarrollo a medida?

Apps web, IA, módulos ERP — cuéntame tu proyecto.