Code Quality

ESLint

ESLint es el linter pluggable que detecta bugs y aplica convenciones antes de que lleguen a revisión. Con flat config y soporte para TypeScript, se adapta a cualquier stack moderno.

intermediate13 min readUpdated 15 sept 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",
    },
  },
);
Analiza
JavaScript y TypeScript
Config
eslint.config.js (flat)
Reglas
Off, warn, error
Correcciones
Muchas reglas tienen auto-fix
Extensible
Plugins y parsers
Se ejecuta en
CLI, editores, CI

Por que importa

Por qué el linting se paga solo

Detecta bugs temprano

Las reglas detectan variables no utilizadas, comparaciones inseguras, awaits faltantes y cientos de otros errores antes de que lleguen a producción.

Correcciones automáticas

Muchos problemas se solucionan con --fix, por lo que el estilo y los bugs simples se corrigen sin edición manual.

Aplica convenciones

Los equipos codifican sus estándares en la configuración para que las revisiones se centren en el diseño y no en detalles triviales.

La imagen completa

Las tres ideas detrás de ESLint

Un parser lee tu código, un conjunto de reglas reporta problemas y la configuración decide qué reglas se aplican y dónde.

El parser

Leer

Convierte el código fuente en un AST que las reglas pueden inspeccionar, incluyendo TypeScript a través de un parser.

Reglas

Reportar

Verificaciones individuales, cada una configurable como off, warn o error, y a menudo auto-corregibles.

Config

Componer

Los archivos de flat config combinan presets recomendados, plugins y overrides por archivo.

ESLint de un vistazo

El núcleo de ESLint

eslint.config.js

El archivo de flat config que exporta un array de objetos de configuración.

Severidad de reglas

off, warn y error controlan cómo reporta cada regla.

Plugins

Añaden reglas para React, TypeScript, imports, accesibilidad y más.

Presets

Las configuraciones compartibles empaquetan un conjunto curado de reglas.

--fix

Aplica correcciones automáticas para las reglas que las soportan.

Editores y CI

Haz lint on save localmente y falla el build en CI.

Una breve historia

De sucesor de JSHint a estándar de linting

  1. 2013

    Lanzamiento de ESLint

    Nicholas Zakas crea un linter totalmente pluggable como sucesor de JSHint.

    13
  2. 2015

    Soporte para ES6 y JSX

    La sintaxis moderna y el soporte para React convierten a ESLint en la opción predeterminada.

    15
  3. 2019

    TypeScript de primera clase

    typescript-eslint trae el linting consciente de tipos al ecosistema.

    19
  4. 2024

    Flat config por defecto

    El formato de flat config se convierte en el estándar, reemplazando los archivos .eslintrc.

    24
  5. Hoy

    El estándar de linting

    Utilizado por casi todos los proyectos de JavaScript y TypeScript.

    Hoy

La guia completa

ESLint: Todo lo que necesitas saber

¿Qué es ESLint?

ESLint es un linter pluggable para JavaScript y TypeScript. Analiza tu código convirtiéndolo en un árbol de sintaxis, ejecuta un conjunto de reglas sobre él y reporta los problemas encontrados. Las reglas varían desde la detección de errores reales —variables no utilizadas, falta de await, comparaciones inseguras— hasta convenciones que tu equipo desee implementar.

El valor es acumulativo. Cada regla detecta una clase de error una sola vez, en todas partes y para siempre, en lugar de depender de que los revisores lo noten. Muchas reglas también se corrigen solas, por lo que eslint --fix limpia una cantidad sorprendente de código automáticamente. ESLint es una de las herramientas con mayor impacto en un proyecto de JavaScript.

Flat config

ESLint utiliza flat config: un archivo que exporta un array de objetos de configuración. Este formato reemplaza el antiguo formato .eslintrc mediante importaciones explícitas y una composición predecible.

// 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 puede especificar a qué archivos se aplica, qué plugins registra y qué reglas establece. Los objetos posteriores sobrescriben a los anteriores, por lo que el array se lee de arriba hacia abajo, como una cascada.

Reglas y severidad

Cada regla tiene una severidad: "off", "warn" o "error".

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

Algunas reglas aceptan opciones, como ocurre con no-console aquí. error hace que el CI falle; warn reporta el problema sin fallar. Usa warn para reglas que estés implementando gradualmente y error para cualquier cosa que deba bloquear un merge.

Plugins y presets

Los plugins añaden reglas para ecosistemas específicos, y los presets empaquetan un conjunto seleccionado de ellas.

// 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"],
];

Los plugins más comunes cubren React, Vue, TypeScript, imports, librerías de testing y accesibilidad. Empezar con eslint:recommended más un preset de framework te aporta el 90% del valor con casi ninguna configuración. Añade reglas individuales solo cuando tengas un motivo justificado.

Linting consciente de los tipos

typescript-eslint puede utilizar el comprobador de tipos de TypeScript para reglas que el análisis sintáctico simple no puede gestionar.

// 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",
  },
});

Reglas como no-floating-promises detectan errores que son realmente difíciles de notar al leer el código: una promesa que nunca se espera con await. El linting consciente de los tipos es más lento porque ejecuta el comprobador de tipos, por lo que muchos proyectos lo habilitan para el código fuente y lo omiten en las pruebas y los archivos de configuración.

Corrección y desactivación

Muchas reglas se pueden corregir automáticamente, así que ejecuta el corrector antes de leer la salida.

npx eslint . --fix

Cuando realmente necesites incumplir una regla, desactívala de forma puntual y explica el motivo.

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

El uso de /* eslint-disable */ general al principio de un archivo desactiva todo, incluyendo las reglas que habrían detectado errores reales. Es preferible usar una desactivación de una sola línea con una justificación, y ajustar la configuración si una regla entra en conflicto con tus estándares.

Editores y CI

Instala la extensión de ESLint en tu editor y activa la opción de corregir al guardar (fix-on-save). Así recibirás feedback mientras escribes y se aplicarán correcciones seguras de inmediato, convirtiendo el linting en parte del flujo de edición en lugar de una tarea tediosa. En CI, ejecuta ESLint como un paso independiente para que los fallos sean claros y rápidos, y cachea los resultados siempre que sea posible.

Dónde encaja ESLint

ESLint se encarga de la calidad del código; Prettier se encarga del formato. La configuración estándar consiste en dejar que Prettier gestione el estilo y desactivar las reglas de ESLint que entren en conflicto, a menudo mediante una configuración compartida. Juntos, permiten que los revisores discutan el diseño en lugar de los espacios y los puntos y coma.

Mejores prácticas

  • Comienza desde eslint:recommended y un preset de framework, y luego añade reglas de forma deliberada.
  • Utiliza flat config con imports explícitos y una lista de ignores clara.
  • Deja que Prettier se encargue del formateo y desactiva las reglas de ESLint que entren en conflicto.
  • Ejecuta --fix antes de clasificar los problemas restantes.
  • Activa las reglas type-aware para los archivos fuente.
  • Desactiva las reglas de forma puntual, incluyendo un comentario que explique el motivo.
  • Ejecuta el linting en el editor, en un pre-commit hook y en CI.

Errores comunes

  • Hacer linting de dist, código generado y dependencias.
  • Desactivar reglas de forma generalizada en lugar de solucionar la causa raíz.
  • Activar todas las reglas a la vez y saturarse con el ruido.
  • Duplicar reglas de formato que Prettier ya gestiona.
  • Ejecutar linting basado en tipos (type-aware linting) en todo el repositorio, ralentizando el proceso.
  • Tratar las advertencias como inofensivas hasta que se acumulan.

Próximos pasos

ESLint es la puerta de enlace de calidad para tu base de código. Combínalo con Prettier para el formateo, profundiza en los tipos con TypeScript e intégralo en el build de Vite y en tu pipeline de CI. Después, activa una regla nueva y corrige cada instancia; es un pequeño hábito con una gran recompensa.

Desactivar una regla

Cambia la configuración o añade un disable específico con una razón. Desactivar reglas a nivel de archivo oculta problemas reales.

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

Uso de flat config

Flat config es el estándar actual: un array simple de objetos de configuración, más fácil de componer y depurar.

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

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender ESLint?

Nuestro tutorial interactivo te guia a traves de ESLint paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.