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 facoltativeRequired<T> — rende tutte le proprietà obbligatoriePick<T, K> — seleziona solo le proprietà K dal tipo TOmit<T, K> — esclude le proprietà K dal tipo Ttype 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.
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 }
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.