ProgrammationDéveloppeur Fullstack

Qu'est-ce que les 'utility types' en TypeScript (par exemple, Partial, Required, Pick, Omit), où et comment les appliquer, et quelles erreurs sont souvent commises lors de leur utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Utility types — ce sont des outils intégrés de TypeScript pour transformer, modifier ou obtenir des types dérivés basés sur des types existants. Les plus courants sont :

  • Partial<T> — rend toutes les propriétés du type T facultatives
  • Required<T> — rend toutes les propriétés obligatoires
  • Pick<T, K> — sélectionne uniquement les propriétés K du type T
  • Omit<T, K> — exclut les propriétés K du type T

Exemple d'utilisation :

type User = { id: number; name: string; age?: number }; type UserPreview = Pick<User, 'id' | 'name'>; type UserPatch = Partial<User>; type FullUser = Required<User>; type UserWithoutAge = Omit<User, 'age'>;

Cela permet de créer des API et des DTO plus flexibles.

Question piège

Si une propriété du type est déclarée comme facultative (age?: number), comment se comportera Required<T> ? Resterait-elle facultative ?

Réponse : Non, Required<T> transforme toutes les propriétés du type T, y compris les facultatives, en obligatoires (requises).

type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


Histoire

Nous avons utilisé Partial<T> pour mettre à jour des objets, pensant que cela était automatiquement sûr pour la base de données. Nous avons oublié de vérifier les champs pour null/undefined et avons rencontré des erreurs de validation lors de la mise à jour des entités.


Histoire

Nous avons utilisé Omit<T, K> pour exclure des propriétés techniques du type de requête, sans tenir compte du fait que lors du refactoring des modèles, de nouveaux champs techniques n'ont pas été ajoutés à la liste des exclusions. En conséquence, des champs privés "ont fuité" à l'extérieur via l'API.


Histoire

Dans une bibliothèque partagée, nous avons créé un type Pick<T, K>, en nous trompant dans la liste des clés : K était partiellement absent dans le type d'origine. TypeScript a ignoré l'erreur lors de l'utilisation de chaînes littérales, mais lors de la modification du type d'origine, un décalage est apparu et une partie des types a "cassé" dans tous les services.