⚙️ tsconfig.json essentiel

{
  "compilerOptions": {
    // Cible de compilation
    "target": "ES2022",       // version JS générée
    "module": "ESNext",       // système de modules
    "moduleResolution": "bundler", // résolution modules
    "lib": ["ES2022", "DOM"],  // bibliothèques disponibles

    // Strictness (TOUJOURS activer en production)
    "strict": true,           // active tout le strict mode
    "noUncheckedIndexedAccess": true, // arr[i] peut être undefined
    "exactOptionalPropertyTypes": true,

    // Output
    "outDir": "./dist",
    "rootDir": "./src",
    "declaration": true,     // génère les .d.ts
    "sourceMap": true,

    // Paths alias
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"],
      "@types/*": ["./src/types/*"]
    }
  },
  "include": ["src"],
  "exclude": ["node_modules", "dist"]
}

🔒 Strict mode — ce qu'il active

OptionEffet
strictNullChecksnull/undefined ne sont plus assignables à d'autres types
strictFunctionTypesVérification contravariante des paramètres de fonctions
strictPropertyInitializationChaque propriété de classe doit être initialisée
noImplicitAnyInterdit les any implicites — doit être annoté
noImplicitThisInterdit this implicitement typé any
alwaysStrictAjoute "use strict" dans les fichiers générés
Règle d'or : activez "strict": true dès le début du projet. Activer strict sur un projet existant = douloureux. Partir strict = propre.

📦 Modules ES6 avec TypeScript

// types.ts — fichier de types
export interface User {
  id: number;
  name: string;
}
export type UserId = User["id"];

// utils.ts
import type { User } from "./types"; // import de type (effacé à la compile)
export function formatUser(u: User): string {
  return `[${u.id}] ${u.name}`;
}

// index.ts
import { formatUser } from "./utils";
import type { User } from "./types";

📄 Fichiers de déclaration .d.ts

// Typer une librairie JS sans types
// src/types/legacy-lib.d.ts
declare module "legacy-lib" {
  export function doSomething(val: string): number;
  export const VERSION: string;
}

// Augmenter un module existant
declare module "express" {
  interface Request {
    user?: { id: number; role: string };
  }
}

// Déclarer des variables globales
declare const __APP_VERSION__: string;
declare function fetch(url: string): Promise<Response>;
Les types officiels sont dans @types/nom-du-paquet sur npm. Ex : npm install -D @types/node @types/express

🔍 ESLint + TypeScript

# Installation
npm install -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin

// .eslintrc.json
{
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint"],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:@typescript-eslint/recommended-type-checked"
  ],
  "parserOptions": { "project": "./tsconfig.json" },
  "rules": {
    "@typescript-eslint/no-explicit-any": "error",
    "@typescript-eslint/explicit-function-return-type": "warn"
  }
}

📁 Structure de projet recommandée

mon-projet/
├── src/
│   ├── types/           # interfaces et types partagés
│   │   ├── index.ts
│   │   └── api.ts
│   ├── utils/           # fonctions utilitaires
│   ├── services/        # logique métier
│   └── index.ts         # point d'entrée
├── dist/                # fichiers compilés (gitignored)
├── tsconfig.json
├── .eslintrc.json
└── package.json
📝 Exercices T06 🎯 QCM T06 ▶ Mini-projet T07 — TS + React →