Il tipo di utilità Pick<T, K> è stato aggiunto in TypeScript per affrontare il problema della copia selettiva di parte dei campi da un tipo o interfaccia esistente.
Spesso, durante lo sviluppo, vengono riutilizzate le stesse strutture dati con lievi variazioni. Prima dell'arrivo di Pick era necessario creare nuove interfacce copiando manualmente i campi desiderati, il che portava a duplicazione del codice e errori durante le successive modifiche delle strutture originali.
È necessario tipizzare i dati in ingresso o in uscita di una funzione utilizzando solo parte dei campi di una grande interfaccia, per evitare ridondanze e specificare al massimo il contratto.
Pick risolve il problema di estrarre un sottoinsieme delle proprietà di tipo T per chiavi K:
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
Esempio:
interface User { id: number; name: string; email: string; } type Credentials = Pick<User, 'email' | 'name'>; const creds: Credentials = { email: "user@example.com", name: "User Name", };
Caratteristiche chiave:
Qual è la differenza tra Pick e Omit?
Pick seleziona solo i campi elencati del tipo; Omit, al contrario, li esclude dalla struttura.
type PartialUser = Omit<User, 'id'>; // Tutti i campi tranne id
È possibile utilizzare Pick per selezionare una proprietà inesistente?
No, le chiavi K devono necessariamente essere le chiavi del tipo originale, altrimenti ci sarà un errore di compilazione.
Può Pick influire sull'opzionalità o sui campi readonly?
Pick mantiene i modificatori delle proprietà (optional, readonly), se erano nel tipo originale, semplicemente li copia nel nuovo.
Durante il lavoro su un modulo di input, lo sviluppatore ha descritto manualmente il proprio tipo, dimenticando un nuovo attributo obbligatorio aggiunto in User. Il modulo ha smesso di funzionare dopo l'aggiornamento dell'interfaccia.
Pro:
Contro:
Viene utilizzato Pick per selezionare i campi necessari nel modulo:
type FormFields = Pick<User, 'email' | 'name'>;
Le modifiche in User si riflettono automaticamente nel modulo.
Pro:
Contro: