Menu

Pick en TypeScript : sélectionner des propriétés d'un type

Pick<T, K> crée un type ne contenant que les propriétés de T dont les clés sont dans K. Découvrez Pick avec une ou plusieurs clés, la vérification des clés, Pick vs Omit, la sélection dans des types imbriqués, une fonction pick() typée, et la sélection de propriétés selon le type de leur valeur.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Pick<T, K> est un utility type intégré qui crée un type objet ne contenant que les propriétés de T nommées dans K. Utilisez-le quand une fonction ou un composant a besoin de quelques champs d'un type plus grand :

renderPreview accepte un User complet mais aussi un simple objet { id, name }, car elle ne demande que ce qu'elle utilise. Elle est ainsi plus facile à appeler et à tester. Pick n'existe que dans les types : l'objet ada complet a toujours ses cinq propriétés à l'exécution.

Syntaxe et vérification des clés

Pick<Type, Keys>

Keys est une clé unique ou une union de clés, et chacune doit exister sur Type. La définition dans la bibliothèque standard de TypeScript en fait une contrainte :

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

Grâce à K extends keyof T, une clé mal orthographiée ou absente est une erreur de compilation, et votre éditeur peut compléter automatiquement les noms de clés :

L'erreur est error TS2344: Type '"cost"' does not satisfy the constraint 'keyof Product'. C'est une différence avec Omit, dont les clés ne sont pas vérifiées.

Pick conserve readonly et le caractère optionnel

Pick parcourt les clés de T, donc chaque propriété sélectionnée garde ses modificateurs :

La dernière ligne affiche { id: 8 } parce que readonly n'est qu'une vérification à la compilation : l'affectation a été signalée, l'erreur supprimée avec @ts-expect-error, et le code s'est quand même exécuté. Pour changer les modificateurs en même temps que la sélection, enveloppez le résultat : Partial<Pick<Account, "plan">> ou Required<Pick<Account, "email">>.

Pick vs Omit

Pick nomme ce qu'il faut garder ; Omit nomme ce qu'il faut retirer. Les deux donnent le même résultat aujourd'hui, mais ils se comportent différemment quand le type source grandit :

Pick<T, K>Omit<T, K>
Vous listezles clés à garderles clés à retirer
Nouvelles propriétés sur Tnon inclusesincluses automatiquement
Clé inconnue dans Kerreur de compilation (TS2344)acceptée sans rien dire
Adapté pourréponses d'API, vues publiques, props« tout sauf le secret »

Pour des données qui quittent votre serveur, Pick est le choix par défaut le plus sûr : rien n'apparaît dans le type sans que quelqu'un l'ait ajouté volontairement.

Sélectionner dans des types imbriqués

Pick ne voit que les clés de premier niveau : un chemin pointé comme Pick<Customer, "address.city"> est une erreur (TS2344), pas une sélection imbriquée. Utilisez un indexed access type pour atteindre le type imbriqué, puis faites le pick dessus :

Customer["address"] est le type de la propriété address. La même syntaxe atteint les éléments d'un tableau : pour une propriété orders: Order[], Customer["orders"][number] vaut Order.

Une fonction pick() typée

Pick ne fait rien à l'exécution. Une petite fonction générique copie les propriétés choisies dans un nouvel objet et renvoie exactement Pick<T, K> :

K extends keyof T permet à TypeScript d'inférer K à partir des arguments string, donc le type de retour contient exactement les clés choisies. L'assertion {} as Pick<T, K> est nécessaire parce qu'un objet vide n'a pas encore ces propriétés ; la boucle les remplit.

Sélectionner des propriétés selon le type de leur valeur

Pick sélectionne par nom de clé. Pour sélectionner selon le type de la propriété, par exemple « tous les champs string », écrivez un mapped type avec un filtre sur les clés :

La clause as associe chaque clé à elle-même quand son type correspond, et à never sinon, et les clés never sont supprimées. Une subtilité : le type d'une propriété optionnelle inclut undefined, donc un subtitle?: string optionnel ne compterait pas comme string ici ; testez par rapport à string | undefined pour l'inclure.

Questions fréquentes

À quoi sert Pick en TypeScript ?

Pick<T, K> construit un type objet qui ne contient que les propriétés de T dont les clés sont dans K. Pick<User, "id" | "name"> vaut { id: number; name: string } quand User possède ces deux propriétés et d'autres. Il n'agit que sur les types et ne retire rien des objets à l'exécution.

Quelle est la différence entre Pick et Omit ?

Pick liste les propriétés à garder, Omit celles à retirer. Quand le type source gagne une propriété, Omit l'inclut automatiquement et Pick non. Pick vérifie aussi que ses clés existent sur le type ; Omit accepte n'importe quelle clé.

Comment sélectionner plusieurs propriétés en TypeScript ?

Passez une union de clés : Pick<User, "id" | "name" | "email">. Toutes les clés doivent exister sur User, sinon le compilateur signale l'erreur TS2344.

Comment sélectionner une propriété imbriquée en TypeScript ?

Pick ne sélectionne que les propriétés de premier niveau. Atteignez un type imbriqué avec un indexed access type et faites le pick dessus : Pick<User["address"], "city">. Pour garder l'imbrication, combinez les deux : Pick<User, "id"> & { address: Pick<User["address"], "city"> }.

Pick conserve-t-il les modificateurs readonly et optionnel ?

Oui. Pick est un mapped type sur les clés de T, donc une propriété readonly ou optionnelle dans T le reste dans le type obtenu.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER