TypeScript Academy · Leçon

Créer un outil simple d’analyse statique

Créez un outil de diagnostic personnalisé avec l’API du compilateur

Leçon 4 sur 413 étapes

Créer un outil simple d’analyse statique est une leçon TypeScript Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage TypeScript Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours TypeScript Academy comprend 4 leçons au total.

Qu’est-ce qu’un outil d’analyse de code ?

Un outil d’analyse de code examine le code source afin de signaler les problèmes de style ou de correction. L’utilisation de l’API du compilateur TypeScript vous permet de créer des règles qui tiennent compte des types, ce que les extensions ESLint ne peuvent pas faire seules.

// Goal: warn when console.log is called in TypeScript files

Configuration du projet

Créez un script Node.js qui charge un programme TypeScript, parcourt l’AST et signale les diagnostics.

import ts from "typescript";
import path from "path";

const files = ["src/index.ts"];
const program = ts.createProgram(files, { strict: true });

Définition d’une règle

Une règle est une fonction qui reçoit un nœud AST et renvoie éventuellement un message de diagnostic si la règle est enfreinte.

type Diagnostic = { file: string; line: number; message: string };

function noConsoleLog(node: ts.Node, sf: ts.SourceFile): Diagnostic | null {
  if (!ts.isCallExpression(node)) return null;
  const expr = node.expression.getText(sf);
  if (expr !== "console.log") return null;
  const { line } = sf.getLineAndCharacterOfPosition(node.pos);
  return { file: sf.fileName, line: line + 1, message: "No console.log allowed" };
}

Parcours de l’AST

Écrivez un parcours récursif qui applique toutes les règles à chaque nœud de chaque fichier source.

function walk(
  node: ts.Node,
  sf: ts.SourceFile,
  rules: ((n: ts.Node, sf: ts.SourceFile) => Diagnostic | null)[]
): Diagnostic[] {
  const diags: Diagnostic[] = [];
  for (const rule of rules) {
    const d = rule(node, sf);
    if (d) diags.push(d);
  }
  ts.forEachChild(node, child => diags.push(...walk(child, sf, rules)));
  return diags;
}

Exécution de l’analyseur

Parcourez tous les fichiers source, appliquez les règles et affichez les diagnostics.

const rules = [noConsoleLog];
const allDiagnostics: Diagnostic[] = [];

for (const sf of program.getSourceFiles()) {
  if (!sf.isDeclarationFile) {
    allDiagnostics.push(...walk(sf, sf, rules));
  }
}

allDiagnostics.forEach(d =>
  console.log(`${d.file}:${d.line} — ${d.message}`)
);

Ajout d’une règle tenant compte des types

Utilisez le vérificateur de types pour créer des règles qui dépendent du type TypeScript d’une expression.

const checker = program.getTypeChecker();

function noAnyReturn(node: ts.Node, sf: ts.SourceFile): Diagnostic | null {
  if (!ts.isFunctionDeclaration(node)) return null;
  const sig = checker.getSignatureFromDeclaration(node);
  if (!sig) return null;
  const ret = checker.getReturnTypeOfSignature(sig);
  if (ret.flags & ts.TypeFlags.Any) {
    const { line } = sf.getLineAndCharacterOfPosition(node.pos);
    return { file: sf.fileName, line: line + 1, message: "Function returns any" };
  }
  return null;
}

Code de sortie pour l’intégration continue

Renvoyez un code de sortie différent de zéro lorsque des diagnostics sont trouvés, afin que les chaînes d’intégration continue puissent échouer la construction.

if (allDiagnostics.length > 0) {
  console.error(`${allDiagnostics.length} lint error(s)`);
  process.exit(1);
}
process.exit(0);

Règle : aucune variable inutilisée

L’API du compilateur expose les diagnostics concernant les variables inutilisées via ts.getPreEmitDiagnostics, ce qui complète vos règles personnalisées par des vérifications intégrées.

const preEmit = ts.getPreEmitDiagnostics(program);
preEmit.forEach(d => {
  const msg = ts.flattenDiagnosticMessageText(d.messageText, "
");
  console.log(msg);
});

Règle : exiger les types de retour

Une règle qui signale les fonctions dépourvues d’annotations explicites de type de retour contribue à imposer une discipline de documentation.

function requireReturnType(node: ts.Node, sf: ts.SourceFile): Diagnostic | null {
  if (!ts.isFunctionDeclaration(node)) return null;
  if (!node.type) {
    const { line } = sf.getLineAndCharacterOfPosition(node.pos);
    return { file: sf.fileName, line: line + 1, message: "Missing return type" };
  }
  return null;
}

Comparaison avec ESLint

Votre analyseur personnalisé complète ESLint. Utilisez ESLint pour les règles de style et votre outil fondé sur l’API du compilateur TypeScript pour les règles tenant compte des types, qu’ESLint ne peut pas exprimer.

// ESLint: stylistic and common pattern rules
// Compiler API linter: deep type reasoning, custom constraints

Récapitulatif : création d’un analyseur

Un analyseur fondé sur l’API du compilateur TypeScript crée un programme, parcourt l’AST avec des règles, interroge éventuellement le vérificateur de types et se termine avec un code différent de zéro en cas d’erreurs. Cette approche permet de créer des règles d’analyse qui tiennent réellement compte des types.

Vérification rapide

Qu’est-ce qui donne à un analyseur fondé sur l’API du compilateur un avantage par rapport à ESLint ?

Ce que vous avez appris

Vous avez créé un analyseur TypeScript simple à l’aide de l’API du compilateur : charger un programme, parcourir l’AST, appliquer des règles (qui tiennent éventuellement compte des types) et signaler les diagnostics. C’est la base de l’analyse statique personnalisée dans tout projet TypeScript.

Gratuit pour commencer

Apprends TypeScript avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
101
Leçons
352

Questions Fréquemment Posées

La leçon « Créer un outil simple d’analyse statique » est-elle gratuite ?

Oui — le texte complet de « Créer un outil simple d’analyse statique » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours TypeScript Academy, passe à CoddyKit PRO. Le cours TypeScript Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Créer un outil simple d’analyse statique » ?

Créez un outil de diagnostic personnalisé avec l’API du compilateur Tu pratiques TypeScript Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer TypeScript Academy ?

Aucune expérience préalable n'est requise. TypeScript Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Créer un outil simple d’analyse statique » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon TypeScript Academy ?

Oui. Chaque leçon TypeScript Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Créer un programme TypeScript avec l’API
  2. Parcourir l’AST avec des visiteurs
  3. Transformateurs personnalisés et génération de code
  4. Créer un outil simple d’analyse statique
← Retour à TypeScript Academy