TypeScript Academy · Les

Een eenvoudige lintingtool bouwen

Maak een aangepaste diagnostische tool met de compiler-API.

Les 4 van 413 stappen

Een eenvoudige lintingtool bouwen is een gratis TypeScript Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject TypeScript Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus TypeScript Academy bevat in totaal 4 lessen.

Wat is een lintprogramma?

Een lintprogramma analyseert broncode om stijl- of correctheidsproblemen te melden. Met de TypeScript-compiler-API kun je typebewuste regels bouwen die ESLint-plug-ins niet zelfstandig kunnen realiseren.

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

Project instellen

Maak een Node.js-script dat een TypeScript-programma laadt, de AST doorloopt en diagnostische meldingen rapporteert.

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

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

Een regel definiëren

Een regel is een functie die een AST-knooppunt ontvangt en een optionele diagnostische melding retourneert als de regel wordt overtreden.

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" };
}

Door de AST lopen

Schrijf een recursieve doorloop die alle regels op elk knooppunt in elk bronbestand toepast.

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;
}

De linter uitvoeren

Loop over alle bronbestanden, pas de regels toe en geef de diagnostische meldingen weer.

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}`)
);

Een typebewuste regel toevoegen

Gebruik de typechecker om regels te bouwen die afhankelijk zijn van het TypeScript-type van een expressie.

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;
}

Afsluitcode voor CI

Retourneer een afsluitcode die niet nul is wanneer er diagnostische meldingen zijn, zodat CI-pijplijnen het bouwproces kunnen laten mislukken.

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

Regel: geen ongebruikte variabelen

De compiler-API stelt diagnostische meldingen over ongebruikte variabelen beschikbaar via ts.getPreEmitDiagnostics, zodat je eigen regels worden aangevuld met ingebouwde controles.

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

Regel: retourtypen verplichten

Een regel die waarschuwt wanneer functies geen expliciete annotaties voor hun retourtype hebben, helpt om gedisciplineerd te documenteren.

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;
}

Vergelijken met ESLint

Je eigen linter vormt een aanvulling op ESLint. Gebruik ESLint voor stijlregels en je hulpmiddel op basis van de TypeScript-compiler-API voor typebewuste regels die ESLint niet kan uitdrukken.

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

Samenvatting: een linter bouwen

Een linter op basis van de TypeScript-compiler-API maakt een programma, doorloopt de AST met regels, kan de typechecker raadplegen en wordt bij fouten afgesloten met een code die niet nul is. Deze aanpak maakt echt typebewuste lintregels mogelijk.

Korte controle

Waardoor heeft een linter op basis van de compiler-API een voordeel ten opzichte van ESLint?

Wat je hebt geleerd

Je hebt een eenvoudige TypeScript-linter gebouwd met de compiler-API: laad een programma, doorloop de AST, pas regels toe (eventueel typebewust) en rapporteer diagnostische meldingen. Dit vormt de basis voor aangepaste statische analyse in elk TypeScript-project.

Gratis beginnen

Leer TypeScript met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
101
Lessen
352

Veelgestelde vragen

Is de les “Een eenvoudige lintingtool bouwen” gratis?

Ja — de volledige tekst van “Een eenvoudige lintingtool bouwen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus TypeScript Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus TypeScript Academy bevat in totaal 4 lessen.

Wat leer ik in “Een eenvoudige lintingtool bouwen”?

Maak een aangepaste diagnostische tool met de compiler-API. Je oefent met TypeScript Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met TypeScript Academy te beginnen?

Ervaring vooraf is niet nodig. TypeScript Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Een eenvoudige lintingtool bouwen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over TypeScript Academy?

Ja. Elke les over TypeScript Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Een TypeScript-programma maken met de API
  2. De AST doorlopen met visitors
  3. Aangepaste transformers en codegeneratie
  4. Een eenvoudige lintingtool bouwen
← Terug naar TypeScript Academy