TypeScript types avances - 00 - Quand les utility types ne suffisent plus

Introduction aux types avances de TypeScript. Pourquoi apprendre a construire ses propres types et ce que cette serie couvre.

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

Sources

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.