Conceptos Básicos de Linting
8 ejemplos para empezar con Linting y Formato - 6 básicos y 2 intermedios.
Prerrequisitos
- Proyecto Node.js 24.18.0 con TypeScript 5.6+.
- Instala la pila de configuración plana de ESLint 9:
npm install -D eslint@9 typescript-eslint @eslint/jsEjemplos Básicos
1. Configuración Plana Mínima de ESLint
ESLint 9 usa eslint.config.js (o .mjs) en lugar del legado .eslintrc.
// eslint.config.js
import eslint from "@eslint/js";
import tseslint from "typescript-eslint";
export default tseslint.config(
eslint.configs.recommended,
...tseslint.configs.recommended,
{
ignores: ["dist/**", "node_modules/**"],
}
);- La configuración plana es un array de objetos de configuración fusionados en orden.
ignoresreemplaza a.eslintignore.typescript-eslintincluye el parser y el plugin para TS.
2. Añadir Script de Lint
Integra el linting en el flujo de trabajo diario y en CI.
{
"scripts": {
"lint": "eslint .",
"lint:fix": "eslint . --fix"
}
}- Ejecuta
npm run lintantes de hacer push; falla CI en caso de errores. --fixmaneja el orden de importación y las reglas de estilo simples automáticamente.
Relacionado: Mejores Prácticas de Linting - política de cero advertencias
3. Reglas Sensibles al Tipo
Habilita el linting con verificación de tipos para una corrección más estricta.
export default tseslint.config(
...tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
}
);projectService(TS 5.6+) simplifica la configuración deparserOptions.project.- Las reglas sensibles al tipo detectan promesas flotantes y el uso inseguro de
any. - Ligeramente más lento; limita el alcance a
src/**si es necesario.
4. Globales de Node y ESM
Indica a ESLint que se ejecuta en Node con módulos ES.
{
files: ["**/*.ts"],
languageOptions: {
ecmaVersion: 2022,
sourceType: "module",
globals: {
...globals.node,
},
},
}npm install -D globalssourceType: "module"coincide con"type": "module"enpackage.json.- Evita
no-undeffalsos enprocessyBuffer.
5. Prohibir console.log en Código de Producción
Mantén los logs estructurados a través de tu logger, no con console directamente en src/.
{
files: ["src/**/*.ts"],
rules: {
"no-console": ["error", { allow: ["warn", "error"] }],
},
}- Las pruebas y scripts pueden usar un bloque de configuración separado con
no-console: off. - Combínalo con Pino o el logger de la organización en el código de la aplicación.
Relacionado: Integración con Prettier - formato separado del linting
6. Linting de Archivos de Prueba por Separado
Relaja las reglas donde los mocks y any son comunes.
{
files: ["test/**/*.ts", "**/*.test.ts"],
rules: {
"@typescript-eslint/no-explicit-any": "off",
"no-console": "off",
},
}- Las pruebas se benefician del pragmatismo;
src/de producción se mantiene estricto. - Aún prohíbe variables no utilizadas en las pruebas para detectar código de configuración muerto.
Ejemplos Intermedios
7. Configuración Raíz de Monorepo
Comparte una configuración de ESLint entre workspaces.
// eslint.config.js (raíz)
import base from "./packages/eslint-config/index.js";
export default [
...base,
{
files: ["apps/api/**/*.ts"],
rules: { "no-console": "error" },
},
];- Extrae la configuración compartida a
packages/eslint-configpara su reutilización. - Las aplicaciones extienden con solo las anulaciones específicas del servicio.
Relacionado: Límites de Importación - reglas arquitectónicas
8. Puerta de Linting en CI
Falla los PRs en errores y advertencias de lint si adoptas una política de cero advertencias.
- run: npm ci
- run: npm run lint -- --max-warnings 0--max-warnings 0convierte las advertencias en fallos.- Ejecuta el linting después de la instalación, en paralelo con la verificación de tipos para mayor velocidad.
Relacionado: Verificación de Tipos en CI - puerta complementaria
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS Activo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, y NestJS 11.