Template de projet TypeScript / Next.js avec les meilleures pratiques de clean code, pret a cloner pour demarrer un projet pro.
strict: true+noUncheckedIndexedAccess+noFallthroughCasesInSwitch- Zero tolerance pour
any— utiliserunknown, generics, ou types specifiques
| Regle | Niveau | Description |
|---|---|---|
no-var |
error | Jamais var, toujours let/const |
prefer-const |
error | const si jamais reassigne |
no-nested-ternary |
error | Pas de ternaires imbriquees |
no-console |
warn | Pas de console.log (warn/error OK) |
eqeqeq |
error | Toujours ===, jamais == |
no-eval |
error | Jamais eval() |
no-explicit-any |
error | Jamais any explicite |
- Fichiers non utilises
- Exports non utilises
- Dependances fantomes dans package.json
.claude/avec settings et memoireCLAUDE.mdavec toutes les regles du projet- Notes memoire pour les patterns recurrents
pnpm analyzeExecute dans l'ordre :
- tsc — verification des types
- eslint — qualite du code
- knip — code mort et deps inutiles
# Cloner le template
git clone https://github.com/ton-user/setupCleanCodeTS.git mon-projet
cd mon-projet
# Installer les deps de base
pnpm add -D typescript eslint @eslint/eslintrc eslint-config-next knip
pnpm add date-fns
# Copier les fichiers de config dans ton projet existant
cp tsconfig.json eslint.config.mjs knip.json CLAUDE.md /chemin/vers/ton-projet/
cp -r .claude/ /chemin/vers/ton-projet/.
├── .claude/
│ ├── settings.json # Permissions Claude Code
│ └── memory/
│ ├── MEMORY.md # Index des notes
│ ├── feedback_no_nested_ternary.md
│ ├── feedback_use_date_fns.md
│ └── feedback_strict_typescript.md
├── .env.example # Variables d'environnement template
├── .gitignore
├── CLAUDE.md # Regles du projet pour Claude
├── eslint.config.mjs # Config ESLint (flat config)
├── knip.json # Config Knip (dead code)
├── tsconfig.json # TypeScript strict
└── README.md
// Helper avec early returns
function getStatus(user: User) {
if (user.isAdmin) return "admin";
if (user.org) return "organizer";
return "user";
}
// Lookup map
const LABELS: Record<string, string> = { VALID: "Valide", USED: "Utilise" };
const label = LABELS[status] ?? "Inconnu";import { addDays, subHours, format } from "date-fns";
const nextWeek = addDays(new Date(), 7);
const oneHourAgo = subHours(new Date(), 1);
const formatted = format(date, "yyyy-MM-dd");// Typer les reponses API
const data = await api.get("endpoint").json<{ id: string; name: string }>();
// Index access toujours verifie
const first = items[0]; // type: T | undefined
if (first) use(first); // type: T (narrowed)