00 - Quand les utility types ne suffisent plus
Ce que tu vas apprendre
- Pourquoi les utility types intégrés ont des limites
- Ce que tu peux construire en comprenant les mecanismes sous le capot
- Ce que cette serie couvre et comment elle s'articule avec la première
Prerequisites
Avoir termine la serie TypeScript — le système de types. Les concepts de generics, keyof, typeof, index access types et discriminated unions sont requis.
Le type que Partial ne pouvait pas faire
Sur un projet paltemps.fr, j'avais un formulaire d'édition de profil. Le backend attendait un update partiel, mais avec une contrainte : si tu envoies address, tu dois envoyer tous les champs de l'adresse (rue, ville, code postal). Pas de mise à jour partielle de l'adresse.
Partial<User> rend tout optionnel, y compris les champs internes de address. Ca ne correspondait pas au besoin. Je voulais un type ou les propriétés de premier niveau sont optionnelles, mais quand une propriété objet est presente, elle doit etre complète.
typescript// Ce que Partial<User> donne :
type PartialUser = {
name?: string
email?: string
address?: {
street?: string // ❌ je ne veux pas ca
city?: string // ❌ l'adresse doit etre complete
zipCode?: string // ❌ si elle est fournie
}
}
// Ce que je voulais :
type ShallowPartialUser = {
name?: string
email?: string
address?: {
street: string // ✅ obligatoire si address est present
city: string // ✅
zipCode: string // ✅
}
}
Aucun utility type intégré ne fait ca. Il faut le construire. Et pour le construire, il faut comprendre les mapped types et les conditional types :
typescripttype ShallowPartial<T> = {
[K in keyof T]?: T[K]
}
C'est exactement Partial, mais en le construisant toi-meme, tu peux l'adapter. Tu peux ajouter une condition, changer la profondeur, combiner avec d'autres transformations. Les utility types de TypeScript ne sont pas magiques. Ce sont des combinaisons de mapped types, conditional types et infer. Cette serie t'apprend a les construire.
Ce que cette serie couvre
On passe du niveau "utiliser les types" au niveau "construire les types". Chaque article presente un mecanisme du système de types et montre comment le combiner avec les autres.
| # | Article | Contenu |
|---|---|---|
| 01 | Mapped types | Iterer sur les clés d'un type pour en construire un nouveau |
| 02 | Conditional types et infer |
Logique conditionnelle dans les types, extraction |
| 03 | Distributive conditional types | Le piège du distribute et comment le contrôler |
| 04 | Template literal types | Manipuler des strings au niveau des types |
| 05 | Branded types | Simuler le typage nominal en TypeScript |
| 06 | satisfies, as const, const generics |
Les trois outils de precision recents |
| 07 | Types recursifs | DeepPartial, chemins d'objets imbriques |
| 08 | Variance | Covariance, contravariance, et pourquoi ca compte |
| 09 | Overloads et signatures complexes | Plusieurs signatures pour une meme fonction |
| 10 | Déclaration merging et module augmentation | Etendre les types de libs tierces |
| 11 | Symbols, unique symbol, opaque types | Types uniques au runtime |
| 12 | Pattern matching type (ts-pattern) | Le match que TS n'a pas nativement |
| 13 | Typer l'asynchrone | Promise, Awaited, AsyncGenerator |
| 14 | Type erasure | Ce que TS efface au runtime et les consequences |
| 15 | Glossaire | Tous les termes de la serie |
Si la première serie posait les fondations (les briques), celle-ci t'apprend a construire avec. A la fin, tu seras capable de lire et écrire les types qu'on trouve dans les libs comme Prisma, tRPC, Zod ou React.
La troisieme sous-serie, TypeScript — en pratique, appliquera ces outils a des cas concrets : tsconfig, Zod, APIs REST, React, ORMs.
Résumé
- Les utility types intégrés (Partial, Pick, Omit...) sont des combinaisons de mapped types et conditional types
- Quand ils ne suffisent pas, il faut comprendre les mecanismes sous-jacents pour construire ses propres types
- Cette serie couvre 14 mecanismes avances, du mapped type au type erasure
Article suivant : 01 - Mapped types : construire des types dynamiquement