Introduction : pourquoi la documentation est un investissement, pas une perte de temps
Chaque développeur a déjà vécu cette situation : en revenant sur son propre code un mois plus tard, on a du mal à se rappeler à quoi sert tel ou tel paramètre. Que dire des nouveaux membres de l'équipe qui essaient de comprendre votre projet. Une documentation de qualité pour un projet TypeScript n'est pas simplement un ajout agréable, mais un élément crucial qui accélère l'intégration, réduit le nombre de bogues et rend le code maintenable.
TypeScript, en tant que surcouche de JavaScript, offre un système de typage puissant. Cependant, les types eux-mêmes ne répondent pas toujours à la question « pourquoi ». La documentation comble cette lacune. Dans cet article, nous allons parcourir le cycle complet : du choix du style de commentaires à la génération d'un site statique de documentation.
1. Les bases : JSDoc, TSDoc et TypeScript
Pour documenter le code TypeScript, deux standards principaux se sont imposés historiquement : JSDoc et TSDoc. JSDoc est le bon vieux format venu du monde JavaScript. TSDoc est un standard plus moderne, optimisé spécialement pour TypeScript. Les deux approches utilisent des commentaires au format /** ... */.
Examinons un exemple de base avec JSDoc :
/** * Calcule la somme de deux nombres. * @param a - Le premier terme * @param b - Le second terme * @returns La somme de a et b */function add(a: number, b: number): number { return a + b;}Et voici à quoi cela ressemble dans le style TSDoc avec les balises @param et @returns :
/** * Calcule la somme de deux nombres. * @param a - Le premier terme * @param b - Le second terme * @returns La somme de a et b */function add(a: number, b: number): number { return a + b;}La différence est minime, mais TSDoc ajoute la prise en charge de constructions spécifiques à TypeScript, comme les génériques et les types conditionnels.
1.1 Documenter les interfaces et les types
Une attention particulière doit être portée aux interfaces et aux types. Ils constituent le « squelette » d'un projet TypeScript. Voici un exemple d'interface bien documentée :
/** * Représente un utilisateur du système. */interface User { /** Identifiant unique de l'utilisateur */ id: string; /** Nom complet de l'utilisateur */ name: string; /** Adresse email (doit être unique) */ email: string; /** Date de la dernière connexion au système (optionnelle) */ lastLogin?: Date; /** Rôle de l'utilisateur dans le système */ role: 'admin' | 'user' | 'moderator';}Remarquez : chaque paramètre de l'interface a son propre commentaire /** ... */. Cela permet à l'IDE (par exemple, VS Code) d'afficher des indications lors de l'utilisation de cette interface.
2. Techniques avancées : génériques et types conditionnels
TypeScript est réputé pour son système de typage, et la documentation doit refléter sa complexité. Cela concerne particulièrement les génériques (generic types) et les types conditionnels (conditional types).
Examinons un exemple de générique avec documentation :
/** * Crée un tableau à partir d'un seul élément de type T. * @template T - Le type de l'élément qui sera placé dans le tableau * @param item - L'élément à encapsuler * @returns Un tableau contenant l'élément passé */function wrapInArray<T>(item: T): T[] { return [item];}La balise @template indique clairement ce qu'est T. C'est particulièrement utile lorsqu'il y a plusieurs génériques ou qu'ils ont une relation complexe.
Pour les types conditionnels, la documentation devient encore plus importante. Exemple :
/** * Extrait le type de valeur d'une Promise, si une Promise est passée. * Sinon, retourne le type d'origine. * @template T - Le type, qui peut être une Promise ou non * @example * // Pour Promise<number> retournera number * type Result = UnwrapPromise<Promise<number>>; // number