Clean Code en TypeScript : principes et exemples
Dans le développement web moderne, TypeScript est devenu le standard de facto pour créer des applications grandes et fiables. Cependant, TypeScript en lui-même ne garantit pas la qualité du code. Pour qu'un projet reste flexible, compréhensible et facile à maintenir, il est nécessaire de suivre les principes du Clean Code. Dans cet article, nous allons détailler les concepts fondamentaux du code propre en TypeScript avec des exemples concrets. Vous apprendrez à écrire un code qui ravira non seulement le compilateur, mais aussi vos collègues.
Pourquoi le Clean Code est-il important pour TypeScript ?
TypeScript ajoute le typage statique à JavaScript, ce qui aide déjà à éviter de nombreuses erreurs. Mais les types ne sont qu'un outil. Sans une architecture réfléchie et un style lisible, le code se transforme quand même en « spaghetti ». Le Clean Code est une philosophie qui rend le code :
- Lisible — tout développeur comprendra rapidement la logique.
- Maintenable — les modifications à un endroit ne cassent pas toute l'application.
- Évolutif — l'ajout de nouvelles fonctionnalités ne nécessite pas de réécrire la moitié du projet.
L'application de ces principes en TypeScript permet d'exploiter pleinement la puissance du système de types, créant ainsi un code auto-documenté.
Principe 1 : Nommer les variables et les fonctions
Un bon nom, c'est la moitié du succès. Le nom doit répondre aux questions « quoi ? » et « pourquoi ? », pas « comment ? ». Évitez les variables à une seule lettre et les abréviations que vous seul comprenez.
Mauvais exemple :
// Qu'est-ce que d ? Et y ?const d = new Date();const y = d.getFullYear();const fn = (a: number, b: number) => a + b;Bon exemple :
const currentDate = new Date();const currentYear = currentDate.getFullYear();
const sum = (firstNumber: number, secondNumber: number): number => { return firstNumber + secondNumber;};Conseil : Utilisez des noms explicites. Pour les valeurs booléennes, utilisez les préfixes is, has, should. Par exemple : isActive, hasPermission.
Principe 2 : Les fonctions doivent être petites et faire une seule chose
Une fonction ne doit pas être responsable de plusieurs tâches à la fois. Si une fonction fait plus d'une action, il est temps de la diviser. Cela améliore la réutilisabilité et simplifie les tests.
Mauvais exemple (la fonction fait tout à la fois) :
function processUserData(user: any) { // Validation if (!user.email || !user.name) { throw new Error('Invalid user'); } // Formatage const formattedUser = { fullName: user.name.toUpperCase(), emailDomain: user.email.split('@')[1] }; // Sauvegarde en BDD database.save(formattedUser); // Envoi d'email emailService.sendWelcomeEmail(formattedUser);}Bon exemple (séparation des responsabilités) :
function validateUser(user: User): void { if (!user.email || !user.name) { throw new Error('Invalid user data'); }}
function formatUser(user: User): FormattedUser { return { fullName: user.name.toUpperCase(), emailDomain: user.email.split('@')[1] };}
async function processUserData(user: User): Promise<void> { validateUser(user); const formattedUser = formatUser(user); await database.save(formattedUser); await emailService.sendWelcomeEmail(formattedUser);}Chaque fonction a désormais un objectif clair et unique, et elles sont faciles à tester individuellement.
Principe 3 : Utilisez les types et les interfaces pour l'auto-documentation
TypeScript offre des outils puissants pour décrire les données. N'abusez pas du type any — il annule tous les avantages du typage statique. Définissez une interface