ProgrammazioneSviluppatore Fullstack

Che cosa sono i 'utility types' in TypeScript (ad esempio, Partial, Required, Pick, Omit), dove e come dovrebbero essere utilizzati, e quali errori vengono comunemente commessi nel loro uso?

Supera i colloqui con l'assistente IA Hintsage

Risposta

Utility types — sono strumenti incorporati di TypeScript per trasformare, modificare o ottenere tipi derivati basati su quelli esistenti. I più comuni sono:

  • Partial<T> — rende tutte le proprietà del tipo T facoltative
  • Required<T> — rende tutte le proprietà obbligatorie
  • Pick<T, K> — seleziona solo le proprietà K dal tipo T
  • Omit<T, K> — esclude le proprietà K dal tipo T

Esempio di utilizzo:

type User = { id: number; name: string; age?: number }; type UserPreview = Pick<User, 'id' | 'name'>; type UserPatch = Partial<User>; type FullUser = Required<User>; type UserWithoutAge = Omit<User, 'age'>;

Questo consente di creare API e DTO più flessibili.

Domanda trabocchetto

Se una proprietà di tipo è specificata come facoltativa (age?: number), come si comporterà Required<T>? Rimarrà facoltativa?

Risposta: No, Required<T> trasforma tutte le proprietà del tipo T, comprese quelle facoltative, in obbligatorie (richieste).

type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }

Esempi di errori reali dovuti a una mancata comprensione delle sfumature dell'argomento


Storia

Abbiamo usato Partial<T> per aggiornare oggetti, pensando che fosse automaticamente sicuro per il database. Abbiamo dimenticato di controllare i campi per null/undefined e abbiamo ricevuto errori di convalida durante l'aggiornamento delle entità.


Storia

Abbiamo usato Omit<T, K> per escludere proprietà tecniche dal tipo di richiesta, senza considerare che durante il rifattorizzamento dei modelli i nuovi campi tecnici non erano stati aggiunti all'elenco delle esclusioni. Di conseguenza, i campi privati sono "trapelati" all'esterno tramite API.


Storia

Nella libreria condivisa abbiamo creato un tipo Pick<T, K>, commettendo un errore nell'elenco delle chiavi: K era parzialmente assente nel tipo originale. TypeScript ha ignorato l'errore durante l'uso di stringhe letterali, ma quando il tipo originale è stato modificato, è emersa un'incongruenza, e alcuni tipi si sono "rotti" in tutti i servizi.