Introduction : pourquoi TypeScript et REST API sont le duo idéal pour un développement rapide
\nLe développement web moderne exige rapidité et fiabilité. Si vous devez créer rapidement un backend pour une application mobile, un service web ou une architecture de microservices, la combinaison TypeScript + Node.js + Express est l'un des outils les plus efficaces. TypeScript ajoute un typage strict à JavaScript, ce qui permet de détecter les erreurs à la compilation plutôt qu'à l'exécution. C'est particulièrement précieux lors de la construction d'une API REST, où chaque endpoint doit savoir précisément quelles données il accepte et retourne.
\nDans cet article, nous allons créer en 30 minutes une API REST complète pour gérer une liste de tâches (To-Do List). Vous apprendrez à configurer le projet, à écrire des contrôleurs, des routes et des middleware. Le tout avec des exemples pratiques et du code prêt à l'emploi.
\n\nPréparation et configuration du projet (5 minutes)
\nCommençons par créer la structure du projet et installer les dépendances.
\nmkdir todo-api\ncd todo-api\nnpm init -y\nnpm install express cors uuid\nnpm install -D typescript @types/express @types/cors @types/uuid ts-node nodemon\nCréez le fichier tsconfig.json à la racine du projet :
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true,\n "skipLibCheck": true\n },\n "include": ["src/**/*"]\n}\nAjoutez les scripts dans package.json :
"scripts": {\n "dev": "nodemon --exec ts-node src/index.ts",\n "build": "tsc",\n "start": "node dist/index.js"\n}\nCréez le dossier src et le fichier index.ts — le point d'entrée.
Structure de base des dossiers
\n- \n
src/index.ts— point d'entrée, démarrage du serveur \n src/routes/tasks.ts— routes pour les tâches \n src/controllers/taskController.ts— logique de traitement des requêtes \n src/models/task.ts— interfaces et types \n src/middleware/errorHandler.ts— gestion des erreurs (optionnel) \n
Création du modèle de données et des interfaces (5 minutes)
\nDéfinissons les types de données pour notre tâche. Créez le fichier src/models/task.ts :
export interface Task {\n id: string;\n title: string;\n completed: boolean;\n createdAt: Date;\n}\n\nexport type CreateTaskDto = Pick<Task, 'title'>;\nexport type UpdateTaskDto = Partial<Pick<Task, 'title' | 'completed'>>;\nIci, nous utilisons Pick et Partial — des types utilitaires intégrés de TypeScript. CreateTaskDto n'accepte que le titre, tandis que UpdateTaskDto accepte des champs optionnels pour une mise à jour partielle.
Écriture des contrôleurs et des routes (15 minutes)
\nPassons maintenant à la partie la plus intéressante — la logique de l'application. Créons un stockage temporaire des tâches en mémoire (in-memory storage). Pour la production, il faudra le remplacer par une base de données.
\n\nContrôleur des tâches
\nFichier src/controllers/taskController.ts :
import { Request, Response } from 'express';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Task, CreateTaskDto, UpdateTaskDto } from '../models/task';\n\n// Stockage temporaire\nlet tasks: Task[] = [];\n\n// GET /api/tasks\nexport const getAllTasks = (req: Request, res: Response) => {\n res.json(tasks);\n};\n\n// GET /api/tasks/:id\nexport const getTaskById = (req: Request, res: Response) => {\n const task = tasks.find(t => t.id === req.params.id);\n if (!task) {\n return res.status(404).json({ message: 'Tâche non trouvée' });\n }\n res.json(task);\n};\n\n// POST /api/tasks\nexport const createTask = (req: Request, res: Response) => {\n const { title } = req.body as CreateTaskDto;\n if (!title || typeof title !== 'string') {\n return res.status(400).json({ message: 'Le champ title est obligatoire et doit