Construindo uma ferramenta simples de análise de código
Crie uma ferramenta de diagnóstico personalizada com a API do compilador
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 filesConfiguraçã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 constraintsRecapitulaçã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.
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
- Criando um programa TypeScript com a API
- Percorrendo o AST com visitantes
- Transformadores personalizados e geração de código
- Construindo uma ferramenta simples de análise de código