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 facultativesRequired<T> — rend toutes les propriétés obligatoiresPick<T, K> — sélectionne uniquement les propriétés K du type TOmit<T, K> — exclut les propriétés K du type Ttype 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.
Si une propriété du type est déclarée comme facultative (
age?: number), comment se comporteraRequired<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 }
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.