Error de TypeScript string | undefined: cómo solucionarlo y no volverse loco

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: «Type 'string | undefined' is not assignable to type 'string'» — ¿un dolor familiar?

\n\n

Si llevas al menos una semana escribiendo en TypeScript, seguramente has visto este mensaje. Aparece en el momento más inesperado: estás seguro de que la variable es una cadena, pero el compilador insiste obstinadamente: «¡Oye, ahí puede haber undefined!». ¿Te suena?

\n\n

Este error es una de las preguntas más frecuentes en Stack Overflow (miles de visitas, decenas de respuestas). Y no es que TypeScript «se equivoque». Al contrario: te está salvando de errores en tiempo de ejecución que podrían tumbar la aplicación. Pero, ¿cómo explicarle esto al compilador? ¿Cómo hacer que el código sea seguro y legible a la vez?

\n\n

En este artículo analizaremos:

\n
    \n
  • Por qué ocurre el error Type 'string | undefined' is not assignable to type 'string'
  • \n
  • 5 formas prácticas de solucionarlo (de simples a avanzadas)
  • \n
  • Trampas típicas para principiantes
  • \n
  • Cuándo usar ! (non-null assertion) y cuándo es mejor ?? (nullish coalescing)
  • \n
\n\n

¿Listos? ¡Allá vamos!

\n\n

1. ¿Por qué ocurre este error en TypeScript?

\n\n

En JavaScript, una variable puede ser undefined en cualquier momento. TypeScript, especialmente con la bandera strictNullChecks activada, quiere que indiques explícitamente: «Sé que aquí puede haber un valor nulo, y estoy trabajando con eso».

\n\n

Mira este ejemplo simple:

\n\n
function getUsername(id: number): string {\n    const user = users.find(u => u.id === id);\n    return user.name; // ¡Error! user puede ser undefined\n}\n
\n\n

El método find() devuelve User | undefined. Si no se encuentra el usuario, devolverá undefined. TypeScript lo ve y grita: «¡Estás intentando asignar string | undefined a string! ¡No puedes!».

\n\n

Esto no es un error de TypeScript, es una característica. Te obliga a pensar: «¿Y si el usuario no existe? ¿Qué devolverá la función? ¿Una cadena vacía? ¿Lanzará un error?». Y eso está bien.

\n\n

2. 5 formas de solucionar el error (de simple a complejo)

\n\n

2.1. Operador de aserción no nula (!)

\n\n

La forma más rápida (y más peligrosa) es decirle a TypeScript: «Cállate, sé lo que hago».

\n\n
function getUsername(id: number): string {\n    const user = users.find(u => u.id === id);\n    return user!.name; // ! — estoy seguro de que user no es undefined\n}\n
\n\n

Cuándo usarlo: Solo si estás absolutamente seguro de que el valor existe. Por ejemplo, si acabas de agregar este usuario al array y sabes con certeza que find lo encontrará.

\n

Cuándo NO usarlo: En el 90% de los casos. Es como desconectar la bolsa de aire en un coche: funciona, pero el riesgo es enorme.

\n\n

2.2. Verificación con if (type guard)

\n\n

La forma clásica y segura:

\n\n
function getUsername(id: number): string {\n    const user = users.find(u => u.id === id);\n    if (user) {\n        return user.name; // TypeScript sabe: dentro del bloque user es definitivamente User\n    }\n    return 'Invitado'; // fallback\n}\n
\n\n

TypeScript es inteligente: después de la verificación if (user), «reduce» el tipo. Dentro del bloque, user es User, no User | undefined.

\n\n

2.3. Operador de encadenamiento opcional (?.) con fallback

\n\n

Una elegante línea única para trabajar con objetos anidados:

\n\n
function getUsername(id: number): string {\n    const user = users.find(u => u.id === id);\n    return user?.name ?? 'Invitado';\n}\n
\n\n

Analicemos en detalle:

\n
    \n
  • user?.name — si user es undefined, devuelve undefined sin lanzar un error
  • \n
  • ?? 'Invitado' — si el valor de la izquierda es undefined o null, se sustituye por 'Invitado'

Blogs

Book Recommendations