Comment écrire une API REST en TypeScript en 30 minutes : en pratique

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi TypeScript et REST API sont le duo idéal pour un développement rapide

\n

Le 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.

\n

Dans 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\n

Préparation et configuration du projet (5 minutes)

\n

Commençons par créer la structure du projet et installer les dépendances.

\n
mkdir 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
\n

Créez le fichier tsconfig.json à la racine du projet :

\n
{\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}
\n

Ajoutez les scripts dans package.json :

\n
"scripts": {\n  "dev": "nodemon --exec ts-node src/index.ts",\n  "build": "tsc",\n  "start": "node dist/index.js"\n}
\n

Créez le dossier src et le fichier index.ts — le point d'entrée.

\n\n

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
\n\n

Création du modèle de données et des interfaces (5 minutes)

\n

Définissons les types de données pour notre tâche. Créez le fichier src/models/task.ts :

\n
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'>>;
\n

Ici, 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.

\n\n

Écriture des contrôleurs et des routes (15 minutes)

\n

Passons 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\n

Contrôleur des tâches

\n

Fichier src/controllers/taskController.ts :

\n
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                

Blogs

Book Recommendations