Le proprietà opzionali in TypeScript sono contrassegnate con un punto interrogativo (?) dopo il nome della proprietà. Questo significa che la proprietà può essere presente o assente nell'oggetto. Questo è utile per descrivere strutture in cui non tutti i campi sono obbligatori.
Esempio:
interface User { id: number; name?: string; } const u1: User = { id: 1 }; // OK const u2: User = { id: 2, name: 'Ivan' }; // OK
Sfumature:
undefined, ma anche completamente assente nell'oggetto.if (user.name)) non distingue tra undefined e assenza.undefined e accedere a metodi/properties senza controllo.Per difendersi:
undefined:if (user.name !== undefined) { console.log(user.name.toUpperCase()); }
console.log(user.name?.toUpperCase());
Se a un oggetto è descritto un'interfaccia
{ foo?: string }, la proprietàfoopuò essere solo una stringa oundefined? È possibile assegnarvi, ad esempio, il valorenull?
Risposta sbagliata:
undefined, altro non è possibile."Risposta corretta:
null, TypeScript lo consente, ma solo se il tipo è esteso a string | null. Per impostazione predefinita è solo string o undefined.interface A { foo?: string } let x: A = { foo: null }; // Errore!
Storia
In un grande progetto, parte degli oggetti proveniva dal server senza alcuni campi opzionali. Il programmatore chiamava direttamente i metodi su queste proprietà (ad esempio, toLowerCase()), il che portava a errori di runtime se il campo era assente. Per risolvere il problema, il team ha implementato controlli rigorosi e regole del linter per l'accesso ai campi opzionali.
Storia
Negli espressioni logiche si confondeva la presenza della proprietà e la sua verità: if (user.email) non funzionava per le stringhe vuote, anche se la proprietà era stata impostata. Si è verificato un bug, a causa del quale alcune notifiche non venivano inviate agli utenti.
Storia
Il team ha deciso di registrare il valore null in una proprietà opzionale, pensando che fosse corretto. TypeScript ha restituito un errore e per aggirarlo è stato necessario estendere il tipo a string | null, il che ha richiesto una revisione dell'intera logica aziendale per lavorare con questi oggetti.