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:
undefined, sino estar completamente ausente en el objeto.if (user.name)) no distingue entre undefined y la ausencia.undefined y acceder a métodos/propiedades sin verificar.Para protegerse:
undefined:if (user.name !== undefined) { console.log(user.name.toUpperCase()); }
console.log(user.name?.toUpperCase());
Si un objeto tiene la interfaz
{ foo?: string }, ¿siempre la propiedadfoopuede ser solo una cadena oundefined? ¿Se puede asignar, por ejemplo, el valornull?
Respuesta incorrecta:
undefined, no se puede asignar otro valor."Respuesta correcta:
null, TypeScript lo permite, pero solo si el tipo se amplía a string | null. Por defecto, solo es string o undefined.interface A { foo?: string } let x: A = { foo: null }; // ¡Error!
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.