TypeScript Academy · Aula

Construindo uma ferramenta simples de análise de código

Crie uma ferramenta de diagnóstico personalizada com a API do compilador

Aula 4 de 413 etapas

Construindo uma ferramenta simples de análise de código é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de TypeScript Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de TypeScript Academy inclui 4 aulas no total.

O que é uma ferramenta de análise de código

Uma ferramenta de análise de código analisa o código-fonte para relatar problemas de estilo ou correção. Usar a API do compilador TypeScript permite criar regras baseadas em tipos que os plug-ins do ESLint não conseguem alcançar sozinhos.

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

Configuração do projeto

Crie um script Node.js que carregue um programa TypeScript, percorra a AST e relate diagnósticos.

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

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

Definindo uma regra

Uma regra é uma função que recebe um nó da AST e retorna uma mensagem de diagnóstico opcional caso a regra seja violada.

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

Percorrendo a AST

Escreva uma caminhada recursiva que aplique todas as regras a cada nó de cada arquivo de origem.

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

Executando o analisador

Percorra todos os arquivos de origem, aplique as regras e imprima os diagnósticos.

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

Adicionando uma regra baseada em tipos

Use o verificador de tipos para criar regras que dependam do tipo TypeScript de uma expressão.

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

Código de saída para CI

Retorne um código de saída diferente de zero quando forem encontrados diagnósticos, para que os fluxos de CI possam fazer a compilação falhar.

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

Regra: nenhuma variável não utilizada

A API do compilador expõe diagnósticos de variáveis não utilizadas por meio de ts.getPreEmitDiagnostics, complementando suas regras personalizadas com verificações integradas.

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

Regra: exigir tipos de retorno

Uma regra que avisa quando as funções não têm anotações explícitas de tipo de retorno ajuda a reforçar a disciplina de documentação.

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

Comparando com o ESLint

Seu analisador personalizado complementa o ESLint. Use o ESLint para regras de estilo e sua ferramenta baseada na API do compilador TypeScript para regras baseadas em tipos que o ESLint não consegue expressar.

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

Recapitulação: criando um analisador

Um analisador baseado na API do compilador TypeScript: crie um programa, percorra a AST com regras, consulte opcionalmente o verificador de tipos e encerre com um código diferente de zero em caso de erros. Essa abordagem permite criar regras de análise realmente baseadas em tipos.

Verificação rápida

O que dá a um analisador baseado na API do compilador uma vantagem sobre o ESLint?

O que você aprendeu

Você criou um analisador TypeScript simples usando a API do compilador: carregou um programa, percorreu a AST, aplicou regras, opcionalmente baseadas em tipos, e relatou diagnósticos. Essa é a base para a análise estática personalizada em qualquer projeto TypeScript.

Grátis para começar

Aprenda TypeScript com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
101
Aulas
352

Perguntas Frequentes

A aula “Construindo uma ferramenta simples de análise de código” é grátis?

Sim — o texto completo de “Construindo uma ferramenta simples de análise de código” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de TypeScript Academy, atualize para CoddyKit PRO. O curso de TypeScript Academy inclui 4 aulas no total.

O que vou aprender em “Construindo uma ferramenta simples de análise de código”?

Crie uma ferramenta de diagnóstico personalizada com a API do compilador Você pratica TypeScript Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar TypeScript Academy?

Nenhuma experiência prévia é necessária. TypeScript Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Construindo uma ferramenta simples de análise de código”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de TypeScript Academy?

Sim. Cada aula de TypeScript Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Criando um programa TypeScript com a API
  2. Percorrendo o AST com visitantes
  3. Transformadores personalizados e geração de código
  4. Construindo uma ferramenta simples de análise de código
← Voltar para TypeScript Academy