Utilitaires CLI en TypeScript : de l'idée à l'outil prêt en une heure

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

Pourquoi TypeScript est-il le langage idéal pour les utilitaires CLI ?

\n

Si vous écrivez en Python et que vous envisagez soudainement de créer un utilitaire console, votre premier réflexe sera probablement d'utiliser argparse ou click. Et c'est logique. Mais que diriez-vous si je vous disais que TypeScript peut surpasser n'importe quel outil Python dans le monde des CLI ? Oui, vous avez bien entendu.

\n

TypeScript n'est pas simplement "JavaScript avec des types". C'est un langage qui transforme le développement d'utilitaires CLI en un processus prévisible et sécurisé. Fini les "pourquoi j'ai un undefined au lieu d'une chaîne ?" ou "j'ai passé un nombre, mais il est devenu une chaîne". Le typage strict élimine toute une classe d'erreurs dès la phase de compilation.

\n

Mais le principal avantage est l'écosystème. Node.js permet d'exécuter du code TypeScript n'importe où : sur un serveur, dans Docker, sur un Raspberry Pi. Et npm rend la publication de l'utilitaire en cinq minutes. Aujourd'hui, nous allons parcourir tout le chemin : d'un dossier vide à un utilitaire CLI prêt à être installé avec la commande npm install -g.

\n\n

Qu'allons-nous construire ?

\n

Imaginez : vous travaillez souvent avec des fichiers JSON et vous avez besoin de compter rapidement le nombre de champs, de vérifier la validité ou de convertir en CSV. Nous allons écrire un utilitaire json-toolkit qui fait trois choses :

\n
    \n
  • validate — vérifie la validité du JSON ;
  • \n
  • count — compte le nombre de clés de premier niveau ;
  • \n
  • to-csv — convertit un tableau d'objets en CSV.
  • \n
\n

Cela semble simple ? Oui. Mais avec cet exemple, vous maîtriserez toutes les techniques clés : traitement des arguments, travail avec le système de fichiers, couleurs dans le terminal et gestion des erreurs.

\n\n

Étape 1. Configuration du projet

\n

Premièrement, créez un dossier et initialisez le projet :

\n
mkdir json-toolkit\ncd json-toolkit\nnpm init -y
\n

Maintenant, installez TypeScript et les paquets nécessaires :

\n
npm install -D typescript @types/node\nnpm install commander chalk
\n
    \n
  • commander — bibliothèque pour l'analyse des arguments de ligne de commande (équivalent de Python argparse, mais plus pratique) ;
  • \n
  • chalk — colore la sortie dans le terminal ;
  • \n
  • @types/node — types pour Node.js.
  • \n
\n

Créez tsconfig.json :

\n
{\n  "compilerOptions": {\n    "target": "ES2020",\n    "module": "commonjs",\n    "outDir": "./dist",\n    "rootDir": "./src",\n    "strict": true,\n    "esModuleInterop": true,\n    "declaration": true\n  },\n  "include": ["src/**/*"]\n}
\n

Notez : outDir est le dossier où le code sera compilé, et rootDir est celui des sources. C'est une pratique standard pour les projets TypeScript.

\n\n

Étape 2. Écrire le cœur de l'utilitaire

\n

Créez le dossier src et le fichier src/index.ts. Commençons par les imports et la configuration de commander :

\n
import { Command } from 'commander';\nimport { readFileSync, existsSync } from 'fs';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n  .name('json-toolkit')\n  .description('Utilitaire pour travailler avec des fichiers JSON')\n  .version('1.0.0');\n\nprogram\n  .command('validate')\n  .argument('<file>', 'chemin vers le fichier JSON')\n  .description('Vérifier la validité du JSON')\n  .action((file: string) => {\n    try {\n      const content = readFileSync(file, 'utf-8');\n      JSON.parse(content);\n      console.log(chalk.green('✓ JSON valide !'));\n    } catch (err) {\n      console.error(chalk.red('✗ Erreur :'), (err as Error).message);\n    }\n  });\n\nprogram\n  .command('count')\n  .argument('<file>', 'chemin vers le fichier JSON')\n  .description('Compter le nombre de clés de premier niveau')\n  .action((file: string) => {\n    if (!existsSync(file)) {\n      console.error(chalk.red('Fichier introuvable !'));\n      return;\n    }\n    const content = readFileSync(file, 'utf-8');\n    const data = JSON.parse(content);\n    const keys = Object                

Blogs

Book Recommendations