ComparaisonComparaisons

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.

Sur cette page

Comparaison point par point

#

Exemple

#
TypeScript
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))
Résultat
{ 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

#
Syntaxe
type New = Pick<Type, "field1" | "field2">
type Other = Omit<Type, "field1">

Plus d’exemples

#
Omit ne vérifie pas les noms de champs
TypeScript
interface Task {
  id: number
  title: string
}

type NewTask = Omit<Task, 'id' | 'ttile'>

const task: NewTask = { title: 'Apprentissage de Python' }
console.log(task)
Résultat
{ 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.

Pick vérifie les noms de champs
TypeScript
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, choisissez Pick.
  • Les types dérivés avec Pick et Omit se 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

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.