ProgramaciónDesarrollador Frontend

¿Cómo funciona el mecanismo de acceso a propiedades opcionales (Optional Properties) en TypeScript, qué problemas se pueden encontrar y cómo evitarlos?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Las propiedades opcionales en TypeScript se indican con un signo de pregunta (?) después del nombre de la propiedad. Esto significa que la propiedad puede estar presente o ausente en el objeto. Esto es útil al describir estructuras donde no todos los campos son obligatorios.

Ejemplo:

interface User { id: number; name?: string; } const u1: User = { id: 1 }; // OK const u2: User = { id: 2, name: 'Iván' }; // OK

Puntos importantes:

  • La propiedad opcional puede no solo ser undefined, sino estar completamente ausente en el objeto.
  • La comprobación de la existencia de un valor (por ejemplo, if (user.name)) no distingue entre undefined y la ausencia.
  • Un error común es no tener en cuenta que la propiedad puede ser undefined y acceder a métodos/propiedades sin verificar.

Para protegerse:

  • Utilice comprobaciones para undefined:
if (user.name !== undefined) { console.log(user.name.toUpperCase()); }
  • Se puede usar el operador de encadenamiento opcional:
console.log(user.name?.toUpperCase());

Pregunta tramposa.

Si un objeto tiene la interfaz { foo?: string }, ¿siempre la propiedad foo puede ser solo una cadena o undefined? ¿Se puede asignar, por ejemplo, el valor null?

Respuesta incorrecta:

  • "La propiedad opcional solo puede ser una cadena o undefined, no se puede asignar otro valor."

Respuesta correcta:

  • En realidad, si se asigna explícitamente null, TypeScript lo permite, pero solo si el tipo se amplía a string | null. Por defecto, solo es string o undefined.
  • Ejemplo:
interface A { foo?: string } let x: A = { foo: null }; // ¡Error!

Ejemplos de errores reales debido a la falta de conocimiento sobre el tema.


Historia

En un gran proyecto, algunos objetos llegaban del servidor sin algunos campos opcionales. El programador llamaba directamente a métodos de estas propiedades (por ejemplo, toLowerCase()), lo que provocaba errores en tiempo de ejecución si el campo estaba ausente. Para solucionar el problema, el equipo implementó estrictas verificaciones y reglas de linters para el acceso a campos opcionales.


Historia

En expresiones lógicas, se confundía la existencia de una propiedad con su veracidad: if (user.email) no funcionaba para cadenas vacías, aunque la propiedad estaba presente. Surgió un error que hacía que algunas notificaciones no se enviaran a los usuarios.


Historia

El equipo decidió asignar el valor null a una propiedad opcional, pensando que era correcto. TypeScript arrojó un error y, para sortearlo, fue necesario ampliar el tipo a string | null, lo que requirió una revisión de toda la lógica comercial relacionada con estos objetos.