Le type utilitaire Pick<T, K> a été ajouté à TypeScript pour résoudre le problème de la copie sélective de certaines propriétés d'un type ou d'une interface existante.
Souvent, au cours du développement, les mêmes structures de données sont réutilisées avec des variations mineures. Avant l'apparition de Pick, il fallait créer de nouvelles interfaces en copiant manuellement les propriétés souhaitées, ce qui entraînait une duplication de code et des erreurs lors des modifications ultérieures des structures d'origine.
Il est nécessaire de typer les entrées ou les sorties d'une fonction en n'utilisant qu'une partie des propriétés d'une grande interface, afin d'éviter la redondance et de préciser au maximum le contrat.
Pick résout le problème d'extraction d'un sous-ensemble de propriétés du type T par les clés K :
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
Exemple:
interface User { id: number; name: string; email: string; } type Credentials = Pick<User, 'email' | 'name'>; const creds: Credentials = { email: "user@example.com", name: "User Name", };
Caractéristiques clés :
Quelle est la différence entre Pick et Omit ?
Pick choisit uniquement les propriétés spécifiées du type ; Omit, au contraire, les exclut de la structure.
type PartialUser = Omit<User, 'id'>; // Toutes les propriétés sauf id
Est-il possible d'utiliser Pick pour sélectionner une propriété inexistante ?
Non, les clés K doivent obligatoirement être des clés du type d'origine, sinon une erreur de compilation se produira.
Pick peut-il influencer l'optionnalité ou les propriétés readonly ?
Pick conserve les modificateurs de propriété (optionnel, readonly), s'ils étaient présents dans le type d'origine, il les copie simplement dans le nouveau.
Lors de la création d'un formulaire de saisie, le développeur a décrit son propre type manuellement, oubliant un nouvel attribut requis ajouté dans User. Le formulaire a échoué après la mise à jour de l'interface.
Avantages :
Inconvénients :
Utilisation de Pick pour extraire les propriétés nécessaires du formulaire :
type FormFields = Pick<User, 'email' | 'name'>;
Les modifications dans User se reflètent automatiquement dans le formulaire.
Avantages :
Inconvénients :