Estándares de Codificación
Estándares de codificación para equipos de Node.js + TypeScript: aplicables en ESLint y CI, no una wiki que nadie lee. Se alinea con los Estándares de Revisión de Código.
Busca en todas las páginas de la documentación
Estándares de codificación para equipos de Node.js + TypeScript: aplicables en ESLint y CI, no una wiki que nadie lee. Se alinea con los Estándares de Revisión de Código.
Tarjeta de receta de referencia rápida.
// package.json
{
"type": "module",
"scripts": {
"lint": "eslint . && prettier --check .",
"typecheck": "tsc --noEmit"
},
"devDependencies": {
"@acme/eslint-config": "^3.0.0",
"typescript": "^5.6.0"
}
}// eslint.config.js (configuración plana)
import acme from "@acme/eslint-config/node-service";
export default [...acme];Reglas no negociables:
@typescript-eslint/no-floating-promises: error@typescript-eslint/no-misused-promises: errorno-console: advertencia (usar logger estructurado)import/no-cycle: errorprettier/prettier: error// packages/eslint-config/node-service.js
import tseslint from "typescript-eslint";
import prettier from "eslint-config-prettier";
export default tseslint.config(
...tseslint.configs.strictTypeChecked,
{
rules: {
"@typescript-eslint/no-floating-promises": "error",
"@typescript-eslint/require-await": "off",
"no-restricted-imports": ["error", {
patterns: [{ group: ["../**/infrastructure/**"], message: "Use application ports" }],
}],
},
},
prettier,
);{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noUncheckedIndexedAccess": true,
"skipLibCheck": true
}
}// .dependency-cruiser.cjs
module.exports = {
forbidden: [
{
name: "no-infra-in-domain",
from: { path: "^src/modules/[^/]+/domain" },
to: { path: "express|fastify|@nestjs" },
},
],
};| Elemento | Convención |
|---|---|
| Archivos | kebab-case.ts |
| Tipos/interfaces | PascalCase |
| Funciones/variables | camelCase |
| Variables de entorno | SCREAMING_SNAKE |
| Archivos de prueba | *.test.ts junto a la fuente |
// Preferir
export async function getUser(id: string): Promise<User | null> { ... }
// Evitar
export function getUser(id: string): Promise<User | null> {
return db.user.findUnique(...); // OK si ESLint está limpio
}// Usar logger hijo con contexto
req.log.info({ userId, orderId, msg: "order_created" });
// Nunca
console.log("order created", user.email);src/modules/orders/
domain/
application/
infrastructure/@acme/eslint-config compartido con control de versiones semántico.strict: false en código legado - Nunca se pone al día. Solución: strict con un presupuesto incremental de // @ts-expect-error que disminuye trimestralmente.eslint-config-prettier al final del array.main.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.
Revisado por Chris St. John·Última actualización: 16 jul 2026