📖 Manuel
TypeScript Mastery
Workflow
- Configuration stricte : Activer
"strict": truedanstsconfig.json(activestrictNullChecks,noImplicitAny,strictFunctionTypes), configurerpathspour les alias d'imports (@/components), choisir le bonmoduleResolution(bundlerpour Vite/esbuild,node16pour Node), définirtargetselon l'environnement cible, utiliserreferencespour les monorepos.
- Types fondamentaux : Maîtriser les union types (
string | number), intersection types (A & B), literal types ("GET" | "POST"), tuple types ([string, number]), enums (préférerconst enumou union de literals), branded types (type UserId = string & { readonly _brand: "UserId" }) pour éviter les confusions de primitives.
- Generics avancés : Écrire des génériques avec constraints (
<T extends object>), utiliser les conditional types (T extends U ? X : Y), le mot-cléinferpour extraire des types (infer R), les mapped types ({ [K in keyof T]: ... }), les template literal types (\${string}Id\``), combiner pour des types puissants et expressifs.
- Utility types : Maîtriser les built-ins (
Partial<T>,Required<T>,Pick<T, K>,Omit<T, K>,Record<K, V>,Readonly<T>,ReturnType<F>,Parameters<F>,Awaited<T>), créer des utilities custom réutilisables (DeepPartial<T>,NonNullableFields<T>), documenter leur usage avec des exemples.
- Type guards et narrowing : Utiliser
typeof,instanceof,inpour le narrowing automatique, créer des user-defined type guards (function isUser(x): x is User), exploiter les discriminated unions (type Shape = Circle | Squareaveckinddiscriminant), écrire des assertion functions (function assert(cond): asserts cond), éviter lesascasts non justifiés.
- Patterns TypeScript : Implémenter le builder pattern typé avec méthodes chaînées, le Result type (
type Result<T, E> = { ok: true; value: T } | { ok: false; error: E }), les branded types pour les IDs métier, la validation runtime aveczod(inférence du schema vers type TS), le pattern Repository typé avec generics.
- Types pour les APIs : Créer des clients API type-safe avec
fetch+ types générés, utilisertRPCpour les APIs full-stack typées end-to-end,Zodiospour les clients REST avec validation, générer des types depuis OpenAPI avecopenapi-typescript, typer les réponses avec des discriminated unions selon le status HTTP.
- Debugging des types : Lire les messages d'erreur TS (déplier les types complexes dans l'IDE), utiliser
type Debug<T> = { [K in keyof T]: T[K] }pour "aplatir" les types, tester les types avec@ts-expect-errorettsd, activer"verbatimModuleSyntax"pour clarifier les imports de types, utilisersatisfiespour valider sans widening.
Règles
- Activer
strict: truesans exception ; les raccourcis type-unsafe (any,as,!) créent des dettes techniques qui explosent en production. - Préférer les
typealiases pour les unions/intersections et lesinterfacepour les shapes extensibles ; utiliserinterfacequand on anticipe le merging de déclarations. - Ne jamais utiliser
any: remplacer parunknownavec narrowing,neverpour les branches impossibles, ou des generics pour la flexibilité. - Générer les types depuis la source de vérité (schéma DB, OpenAPI, Zod schema) plutôt que les écrire manuellement pour éviter la désynchro.
- Expliquer les types complexes avec des commentaires JSDoc (
/** */) ; un type bien nommé avec un commentaire vaut mieux qu'un type inline incompréhensible.