Configurer TypeScript avec tsconfig
target, module, strict, sourceMap et arborescence.
Objectifs
À la fin de cette leçon, vous saurez :
- lire un tsconfig.json section par section ;
- comprendre strict et ses sous-options ;
- organiser src/ et dist/ proprement.
🔗 Pour vous rafraîchir la mémoire : les bases TypeScript · package.json et scripts npm
Le squelette d'une configuration sérieuse
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"sourceMap": true,
"esModuleInterop": true,
"skipLibCheck": true
},
"include": ["src/**/*"]
}
| Option | Rôle |
|---|---|
target | version JS produite (le navigateur/Node le plus vieux supporté) |
module | système de modules du code produit (import/export → NodeNext côté serveur) |
rootDir / outDir | src/.ts → dist/.js : séparation stricte source/build |
strict | le mode rigoureux complet — toujours activé sur projet réel |
sourceMap | mappe les erreurs runtime vers vos .ts (indispensable au débogueur) |
strict : pourquoi tout activer
"strict": true active le paquet de vérifications :
// strictNullChecks : null n'est plus invisible
let nom: string = trouverNom(); // ❌ peut renvoyer null
// noImplicitAny : pas de type deviné en silence
function traiter(d) { ... } // ❌ paramètre implicite any
Sans strict, TS ressemble à un JS avec suggestions. Avec strict, chaque point faible est explicite — c'est là que vivent les vrais gains. Les projets sans strict accumulent une dette de typage impossible à rattraper.
La structure qui en découle
projet/
├── src/
│ ├── index.ts ← rootDir
│ └── services/
├── dist/
│ ├── index.js ← outDir (généré, gitignore)
│ └── services/
└── tsconfig.json
.gitignore : dist/
scripts npm :
build → tsc
start → node dist/index.js
dev → tsx watch src/index.ts
typecheck → tsc --noEmit
Adapter la cible
target ne change PAS ce que vous écrivez : il décrit ce que le JS produit peut utiliser. ES2022 pour Node moderne ; ES2017+ si compatibilité navigateurs anciens exigée. Plus la cible monte, moins le compilateur réécrit — code produit plus proche du source.
Exercice
- Créez un mini-projet avec cette configuration ; vérifiez l'arborescence dist/.
- Désactivez strict temporairement : trouvez un bug que strict attrapait.
- Ajoutez sourceMap puis déboguez un fichier dist avec breakpoint dans le .ts.
- Pourquoi dist/ ne se versionne-t-il jamais ?
Résumé
- target/module/outDir/rootDir = où et comment compiler ; strict = à quel point vérifier.
- src/ source, dist/ généré ; sourceMap relie les deux au débogage.
- Quatre scripts npm suffisent : build, start, dev, typecheck.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 1. Créez le dossier, ajoutez le tsconfig.json du cours et deux fichiers (src/index.ts qui importe src/util.ts). Après npx tsc, l'arborescence attendue est :
projet/
├── src/
│ ├── index.ts
│ └── util.ts
├── dist/
│ ├── index.js ← compilé
│ ├── util.js
│ └── index.js.map ← grâce à sourceMap: true
└── tsconfig.json
Si dist/ reflète la structure de src/, c'est le duo rootDir/outDir qui travaille.
Question 2. Passez temporairement "strict": false. Exemple de bug que strict attrapait : une variable déclarée sans type initial (let nom;) utilisée ensuite comme chaîne — sans strict, nom.toUpperCase() compile puis explose à l'exécution si nom vaut undefined ; avec strictNullChecks, la ligne devient soulignée avant même de lancer le code. Autre classique : oublier d'initialiser une propriété de classe.
Question 3. Avec "sourceMap": true, chaque .js est accompagné d'un .js.map. Dans VS Code, mettez un breakpoint dans src/index.ts, lancez node --enable-source-maps dist/index.js : l'exécution s'arrête sur VOTRE ligne TypeScript, pas sur le JS généré. Sans source maps ni option, le débogueur ne montrerait que du JS illisible.
Question 4. dist/ est dérivé : régénérable par npm run build depuis les sources versionnées. Le versionner doublerait chaque changement dans Git et créerait des désaccords entre sources et builds — exactement comme node_modules.