Code Quality

ESLint

ESLint é o linter plugável que detecta bugs e impõe convenções antes que cheguem à revisão. Com flat config e suporte a TypeScript, ele se adapta a qualquer stack moderna.

intermediate13 min readUpdated 15 de set. de 2026
eslint.config.js
js
// eslint.config.js
import js from "@eslint/js";
import tseslint from "typescript-eslint";

export default tseslint.config(
  js.configs.recommended,
  ...tseslint.configs.recommended,
  {
    rules: {
      "no-console": ["warn", { allow: ["warn", "error"] }],
      "no-unused-vars": "off",
      "@typescript-eslint/no-unused-vars": "error",
    },
  },
);
Analisa
JavaScript e TypeScript
Config
eslint.config.js (flat)
Regras
Off, warn, error
Correções
Muitas regras possuem auto-fix
Extensível
Plugins e parsers
Executa em
CLI, editores, CI

Por que importa

Por que o linting se paga

Detecte bugs precocemente

As regras detectam variáveis não utilizadas, igualdades inseguras, awaits ausentes e centenas de outros erros antes do deploy.

Correções automáticas

Muitos problemas são resolvidos com --fix, permitindo que estilo e bugs simples sejam corrigidos sem edição manual.

Imponha convenções

Equipes codificam seus padrões na config para que as revisões foquem no design e não em detalhes irrelevantes.

O panorama completo

As três ideias por trás do ESLint

Um parser lê seu código, um conjunto de regras reporta problemas e a config decide quais regras se aplicam a cada lugar.

O parser

Ler

Transforma o código fonte em um AST que as regras podem inspecionar, incluindo TypeScript através de um parser.

Regras

Reportar

Verificações individuais, cada uma configurável como off, warn ou error, e frequentemente auto-corrigíveis.

Config

Compor

Arquivos de flat config combinam presets recomendados, plugins e overrides por arquivo.

ESLint em resumo

O núcleo do ESLint

eslint.config.js

O arquivo de flat config que exporta um array de objetos de configuração.

Severidade da regra

off, warn e error controlam como cada regra reporta.

Plugins

Adicionam regras para React, TypeScript, imports, acessibilidade e mais.

Presets

Configs compartilháveis que empacotam um conjunto curado de regras.

--fix

Aplica correções automáticas para as regras que as suportam.

Editores e CI

Faça o lint ao salvar localmente e falhe o build no CI.

Uma breve historia

De sucessor do JSHint ao padrão de linting

  1. 2013

    Lançamento do ESLint

    Nicholas Zakas cria um linter totalmente plugável como sucessor do JSHint.

    13
  2. 2015

    Suporte a ES6 e JSX

    Sintaxe moderna e suporte ao React tornam o ESLint a escolha padrão.

    15
  3. 2019

    TypeScript como cidadão de primeira classe

    O typescript-eslint traz linting consciente de tipos para o ecossistema.

    19
  4. 2024

    Flat config como padrão

    O formato de flat config torna-se o padrão, substituindo os arquivos .eslintrc.

    24
  5. Hoje

    O padrão de linting

    Utilizado por quase todo projeto JavaScript e TypeScript.

    Hoje

O guia completo

ESLint: Tudo que voce precisa saber

O que é o ESLint?

O ESLint é um linter plugável para JavaScript e TypeScript. Ele analisa seu código transformando-o em uma árvore de sintaxe, executa um conjunto de regras sobre ela e reporta problemas. As regras variam desde a detecção de bugs reais — variáveis não utilizadas, await ausentes, igualdades inseguras — até convenções que sua equipe deseja aplicar.

O valor é cumulativo. Cada regra captura uma classe de erro uma única vez, em todos os lugares e para sempre, em vez de depender de revisores para notá-la. Muitas regras também possuem correção automática, então o eslint --fix limpa uma quantidade surpreendente de código automaticamente. O ESLint é uma das ferramentas de maior impacto em um projeto JavaScript.

Flat config

O ESLint utiliza o flat config: um arquivo que exporta um array de objetos de configuração. Ele substitui o formato antigo .eslintrc por imports explícitos e uma composição previsível.

// eslint.config.js
import js from "@eslint/js";
import tseslint from "typescript-eslint";

export default tseslint.config(
  { ignores: ["dist", "coverage", "**/*.generated.*"] },
  js.configs.recommended,
  ...tseslint.configs.recommended,
  {
    files: ["**/*.ts", "**/*.tsx"],
    rules: {
      "@typescript-eslint/no-floating-promises": "error",
    },
  },
);

Cada objeto pode especificar a quais arquivos ele se aplica, quais plugins registra e quais regras define. Objetos posteriores sobrescrevem os anteriores, portanto, o array é lido de cima para baixo, como uma cascata.

Regras e severidade

Cada regra possui uma severidade: "off", "warn" ou "error".

// rules.js
export default [
  {
    rules: {
      eqeqeq: "error",              // require ===
      "no-unused-vars": "warn",
      "no-console": ["warn", { allow: ["warn", "error"] }],
    },
  },
];

Algumas regras aceitam opções, como a no-console faz aqui. error falha no CI; warn reporta sem falhar. Use warn para regras que você está implementando gradualmente e error para qualquer coisa que deva bloquear um merge.

Plugins e presets

Plugins adicionam regras para ecossistemas específicos, e presets agrupam um conjunto selecionado delas.

// react.js
import react from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";

export default [
  react.configs.flat.recommended,
  reactHooks.configs["recommended-latest"],
];

Plugins comuns abrangem React, Vue, TypeScript, imports, bibliotecas de teste e acessibilidade. Começar com eslint:recommended mais um preset de framework entrega 90% do valor com quase nenhuma configuração. Adicione regras individuais apenas quando houver um motivo específico.

Linting com consciência de tipos (Type-aware linting)

typescript-eslint pode utilizar o verificador de tipos do TypeScript para regras que a análise sintática simples não consegue processar.

// type-aware.js
export default tseslint.config({
  languageOptions: {
    parserOptions: {
      projectService: true,
      tsconfigRootDir: import.meta.dirname,
    },
  },
  rules: {
    "@typescript-eslint/no-floating-promises": "error",
    "@typescript-eslint/no-misused-promises": "error",
  },
});

Regras como no-floating-promises capturam bugs que são genuinamente difíceis de notar apenas na leitura: como uma promise que nunca é aguardada (awaited). O linting com consciência de tipos é mais lento porque executa o verificador de tipos, por isso muitos projetos o habilitam para o código-fonte e o desativam para testes e arquivos de configuração.

Corrigindo e desativando

Muitas regras podem ser corrigidas automaticamente, portanto, execute o fixer antes de analisar a saída.

npx eslint . --fix

Quando você realmente precisar quebrar uma regra, desative-a de forma pontual e explique o motivo.

// targeted.js
// eslint-disable-next-line no-console -- intentional debug log
console.log("payment flow", payload);

Um /* eslint-disable */ genérico no topo de um arquivo desativa tudo, incluindo as regras que teriam detectado bugs reais. Prefira a desativação em uma única linha com a justificativa e ajuste a configuração caso uma regra conflite com seus padrões.

Editores e CI

Instale a extensão do ESLint no seu editor e ative a opção de correção ao salvar (fix-on-save). Assim, você recebe feedback enquanto digita e as correções seguras são aplicadas imediatamente, transformando o linting em parte do fluxo de edição em vez de uma tarefa tediosa. No CI, execute o ESLint como uma etapa separada para que as falhas sejam claras e rápidas, e faça o cache dos resultados sempre que possível.

Onde o ESLint se encaixa

O ESLint cuida da qualidade do código; o Prettier cuida da formatação. A configuração padrão é deixar o Prettier responsável pelo estilo e desativar as regras do ESLint que conflitem, geralmente utilizando uma config compartilhada. Juntos, eles garantem que os revisores discutam o design em vez de espaçamentos e pontos e vírgulas.

Melhores práticas

  • Comece com eslint:recommended e um preset de framework, e então adicione regras deliberadamente.
  • Use flat config com imports explícitos e uma lista de ignores clara.
  • Deixe o Prettier cuidar da formatação e desative as regras do ESLint que causem conflito.
  • Execute --fix antes de triar os problemas restantes.
  • Ative regras type-aware para os arquivos de código-fonte.
  • Desative regras de forma pontual, com um comentário explicando o motivo.
  • Execute o lint no editor, em um pre-commit hook e na CI.

Erros comuns

  • Fazer o linting de dist, código gerado e dependências.
  • Desativar regras indiscriminadamente em vez de corrigir a causa raiz.
  • Ativar todas as regras de uma vez e se perder no excesso de alertas.
  • Duplicar regras de formatação que o Prettier já resolve.
  • Executar linting com análise de tipos (type-aware) em todo o repositório, tornando-o lento.
  • Tratar warnings como inofensivos até que eles se acumulem.

Próximos passos

O ESLint é o guardião da qualidade do seu código. Combine-o com o Prettier para formatação, aprofunde a tipagem com TypeScript e integre-o ao build do Vite e ao seu pipeline de CI. Depois, ative uma nova regra e corrija cada ocorrência — é um pequeno hábito com um grande retorno.

Desativando uma regra

Altere a config ou adicione um disable direcionado com um motivo. Desativações genéricas em nível de arquivo escondem problemas reais.

Preferir
// eslint-disable-next-line no-console
console.log("debugging payment flow");
Evitar
/* eslint-disable */
// the whole file is now
// unchecked, including
// real mistakes

Usando flat config

Flat config é o padrão atual — um array simples de objetos de configuração, mais fácil de compor e depurar.

Preferir
export default [
  js.configs.recommended,
  {
    files: ["**/*.ts"],
    rules: { semi: "error" },
  },
];
Evitar
// legacy .eslintrc.json with
// extends, overrides and
// implicit plugin resolution

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender ESLint?

Nosso tutorial interativo te guia por ESLint passo a passo — com quizzes e codigo real que voce pode executar no navegador.