ProgrammazioneSviluppatore Frontend

Как работает механизм обращения к опциональным свойствам (Optional Properties) в TypeScript, с какими проблемами можно столкнуться, и как их избежать?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Una proprietà opzionale può essere non solo undefined, ma anche completamente assente nell'oggetto.
  • Il controllo della presenza di un valore (ad esempio, if (user.name)) non distingue tra undefined e assenza.
  • Un bug comune è non considerare che la proprietà può essere undefined e accedere a metodi/properties senza controllo.

Per difendersi:

  • Utilizzare controlli su undefined:
if (user.name !== undefined) { console.log(user.name.toUpperCase()); }
  • È possibile utilizzare l'operatore di chaining opzionale:
console.log(user.name?.toUpperCase());

Domanda trabocchetto.

Se a un oggetto è descritto un'interfaccia { foo?: string }, la proprietà foo può essere solo una stringa o undefined? È possibile assegnarvi, ad esempio, il valore null?

Risposta sbagliata:

  • "La proprietà opzionale può essere solo una stringa o undefined, altro non è possibile."

Risposta corretta:

  • In realtà, se assegnato esplicitamente a null, TypeScript lo consente, ma solo se il tipo è esteso a string | null. Per impostazione predefinita è solo string o undefined.
  • Esempio:
interface A { foo?: string } let x: A = { foo: null }; // Errore!

Esempi di errori reali a causa della mancanza di conoscenza delle sfumature del tema.


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.