Créer un outil simple d’analyse statique
Créez un outil de diagnostic personnalisé avec l’API du compilateur
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 filesConfiguration 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 constraintsRé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.
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
- Créer un programme TypeScript avec l’API
- Parcourir l’AST avec des visiteurs
- Transformateurs personnalisés et génération de code
- Créer un outil simple d’analyse statique