Pick vs Omit
Pick<Type, Keys> sélectionne seulement les champs donnés d’un type, et Omit<Type, Keys> copie tous les champs sauf ceux donnés.
Comparaison point par point
#Ce qu’il fait
- Pick<Type, Keys>
- Garde seulement les champs mentionnés
- Omit<Type, Keys>
- Garde tout sauf les champs mentionnés
Vérifie que les clés existent dans le type
Résultat pour un type sans champ commun
- Pick<Type, Keys>
- Type vide
{} - Omit<Type, Keys>
- Copie du type source entier
Réagit à un nouveau champ dans le type source
- Pick<Type, Keys>
- Ne l’ajoute pas automatiquement
- Omit<Type, Keys>
- L’ajoute automatiquement
Inverse
- Pick<Type, Keys>
Omit- Omit<Type, Keys>
Pick
Usage typique
- Pick<Type, Keys>
- Vue publique d’un objet, DTO avec quelques champs
- Omit<Type, Keys>
- Données de formulaire sans les champs générés par le serveur
Exemple
#interface User {
id: number
name: string
passwordHash: string
}
type PublicUser = Pick<User, 'id' | 'name'>
type NewUser = Omit<User, 'id'>
const publicUser: PublicUser = { id: 1, name: 'Léa' }
const newUser: NewUser = { name: 'Lucas', passwordHash: 'xyz' }
console.log(publicUser, Object.keys(newUser)){ id: 1, name: 'Léa' } ['name', 'passwordHash']Définition et utilisation
#Les deux types utilitaires créent un nouveau type d’objet à partir d’un type existant, sans le réécrire depuis zéro. Ils fonctionnent avec les mêmes arguments : le type source et une union de noms de champs.
Ils diffèrent par les champs qui restent. Pick<User, "id" | "name"> ne garde que les champs mentionnés, et tous les autres disparaissent. Omit<User, "passwordHash"> fait l’inverse : il garde tout sauf les champs mentionnés. Pick vérifie que les clés données existent dans le type source, mais pas Omit, donc une faute de frappe dans le nom d’un champ à supprimer ne sera pas signalée par le compilateur.
Choisissez Pick quand il est plus simple d’énumérer les quelques champs que vous voulez garder, par ex. pour une vue publique de profil. Choisissez Omit quand il est plus simple d’énumérer les quelques champs à retirer, par ex. les données d’un formulaire sans les champs générés par le serveur. Vous pouvez aussi les combiner avec l’intersection & pour ajouter un champ d’un autre type.
Syntaxe
#type New = Pick<Type, "field1" | "field2">
type Other = Omit<Type, "field1">Plus d’exemples
#interface Task {
id: number
title: string
}
type NewTask = Omit<Task, 'id' | 'ttile'>
const task: NewTask = { title: 'Apprentissage de Python' }
console.log(task){ title: 'Apprentissage de Python' }La faute de frappe ttile n’existe pas dans Task, et le compilateur ne signale pourtant rien, car Omit ne vérifie pas que les clés données existent dans le type source.
interface Task {
id: number
title: string
}
type TaskPreview = Pick<Task, 'id' | 'titel'>
// Erreur : Type '"titel"' does not satisfy the constraint 'keyof Task'.Bonnes pratiques
#- Quand la plupart des champs doivent rester et que seuls quelques-uns disparaissent, choisissez
Omit. Quand seuls quelques champs restent, choisissezPick. - Les types dérivés avec
PicketOmitse mettent à jour automatiquement après un changement du type source, ce qui évite de dupliquer les définitions. - Combinez-les avec l’intersection
&pour changer le type d’un champ :Omit<User, "id"> & { id: string }.
Entrées associées
#- Pick<Type, Keys>Crée un type contenant uniquement les propriétés sélectionnées d’un autre type.
- Omit<Type, Keys>Crée un type sans les propriétés sélectionnées d’un autre type.
- Partial<Type>Crée un type dans lequel toutes les propriétés sont optionnelles.
- Record<Keys, Type>Crée un type d’objet avec des clés données, où chaque valeur a le même type.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.