Padrões de Codificação
Padrões de codificação para equipes Node.js + TypeScript: aplicáveis no ESLint e CI, não um wiki que ninguém lê. Alinha-se com os Padrões de Revisão de Código.
Busque em todas as páginas da documentação
Padrões de codificação para equipes Node.js + TypeScript: aplicáveis no ESLint e CI, não um wiki que ninguém lê. Alinha-se com os Padrões de Revisão de Código.
Cartão de receita de referência 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 (configuração plana)
import acme from "@acme/eslint-config/node-service";
export default [...acme];Regras não negociáveis:
@typescript-eslint/no-floating-promises: erro@typescript-eslint/no-misused-promises: errono-console: aviso (use logger estruturado)import/no-cycle: erroprettier/prettier: erro// 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 portas da aplicação" }],
}],
},
},
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" },
},
],
};| Item | Convenção |
|---|---|
| Arquivos | kebab-case.ts |
| Tipos/interfaces | PascalCase |
| Funções/variáveis | camelCase |
| Variáveis de ambiente | SCREAMING_SNAKE |
| Arquivos de teste | *.test.ts ao lado do código fonte |
// Preferível
export async function getUser(id: string): Promise<User | null> { ... }
// Evitar
export function getUser(id: string): Promise<User | null> {
return db.user.findUnique(...); // OK se o eslint estiver limpo
}// Use logger filho com 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 compartilhado com semver.strict falso em legado - Nunca se atualiza. Correção: strict com um orçamento decrescente trimestral de // @ts-expect-error incremental.eslint-config-prettier por último no array.main.Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026