BaliseTonSite

Modules & Configuration

Organise ton projet et maîtrise le tsconfig.

8.1Import / Export

TypeScript utilise les modules ES6 standards. Chaque fichier est un module isolé :

TypeScripttypescript
// 📁 models/utilisateur.ts
export interface Utilisateur {
  id: number
  nom: string
  email: string
}

export type Role = "admin" | "editeur" | "lecteur"

// Export par défaut (un seul par fichier)
export default class UserService {
  creer(data: Omit<Utilisateur, "id">): Utilisateur {
    return { id: Date.now(), ...data }
  }
}
TypeScripttypescript
// 📁 app.ts
// Import nommé
import { Utilisateur, Role } from "./models/utilisateur"

// Import par défaut
import UserService from "./models/utilisateur"

// Import avec alias
import { Utilisateur as User } from "./models/utilisateur"

// Import de tout
import * as Models from "./models/utilisateur"
const user: Models.Utilisateur = { id: 1, nom: "Alice", email: "a@b.com" }

// Re-export (barrel export)
export { Utilisateur, Role } from "./models/utilisateur"
export { default as UserService } from "./models/utilisateur"

8.2Barrel exports (index.ts)

Un pattern courant pour simplifier les imports, un fichier index.ts réexporte tout :

TypeScripttypescript
// 📁 models/index.ts (barrel)
export * from "./utilisateur"
export * from "./produit"
export * from "./commande"

// Maintenant, au lieu de :
import { Utilisateur } from "./models/utilisateur"
import { Produit } from "./models/produit"
import { Commande } from "./models/commande"

// Tu peux écrire :
import { Utilisateur, Produit, Commande } from "./models"

8.3Import de types uniquement

TypeScripttypescript
// Import de type uniquement - ne génère aucun JavaScript
import type { Utilisateur } from "./models/utilisateur"
import type { FC, ReactNode } from "react"

// Inline type import
import { type Utilisateur, UserService } from "./models/utilisateur"
// Seul UserService sera dans le JS final

// Export de type
export type { Utilisateur }

// Pourquoi c'est utile ?
// → Réduit la taille du bundle
// → Rend les dépendances plus claires
// → Évite les imports circulaires au runtime

8.4Le tsconfig.json - Vue d'ensemble

Le tsconfig.json configure le compilateur TypeScript. Voici les options les plus importantes :

JSONjson
{
  "compilerOptions": {
    // Cible de compilation
    "target": "ES2022",         // Version JS de sortie
    "module": "ESNext",         // Système de modules
    "moduleResolution": "bundler", // Résolution (Node, Bundler...)

    // Strictness (ACTIVE-LES TOUTES !)
    "strict": true,             // Active toutes les vérifications strictes
    "noImplicitAny": true,      // Pas de "any" implicite
    "strictNullChecks": true,   // null/undefined gérés strictement
    "noUnusedLocals": true,     // Erreur si variables non utilisées

    // Chemins
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]        // Alias d'import
    },
    "outDir": "./dist",         // Dossier de sortie
    "rootDir": "./src",         // Dossier source

    // Interop
    "esModuleInterop": true,    // Compatibilité import/require
    "allowSyntheticDefaultImports": true,

    // Déclarations
    "declaration": true,        // Génère les .d.ts
    "sourceMap": true,          // Génère les source maps

    // JSX (pour React)
    "jsx": "react-jsx"          // Support JSX moderne
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

8.5Le mode strict - pourquoi l'activer

TypeScripttypescript
// Sans strict: true
let x     // type : any (implicite) - danger !
x = 42
x = "blah"
x.methodeQuiExistePas()  // Pas d'erreur TS... crash au runtime

// Avec strict: true
let y     // ❌ Erreur : Variable 'y' implicitement 'any'
let z: number  // ✅ Tu dois déclarer le type

// strictNullChecks
function longueur(texte: string | null): number {
  // Sans strictNullChecks :
  return texte.length    // Possible crash

  // Avec strictNullChecks :
  // return texte.length  // ❌ Erreur : texte peut être null
  if (texte === null) return 0
  return texte.length    // ✅ Sûr
}

8.6Fichiers de déclaration (.d.ts)

TypeScripttypescript
// Les fichiers .d.ts décrivent les types SANS le code
// → Pour les bibliothèques JavaScript sans types natifs

// 📁 types/ma-lib.d.ts
declare module "ma-lib-js" {
  export function calculer(a: number, b: number): number
  export function formater(valeur: number, devise: string): string
}

// Maintenant tu peux l'utiliser avec les types :
import { calculer, formater } from "ma-lib-js"
calculer(10, 5)           // ✅ Typé
formater(42, "EUR")       // ✅ Typé

// Pour les bibliothèques populaires, installe @types/xxx :
// npm install @types/lodash
// npm install @types/express

// Ça ajoute les .d.ts automatiquement

8.7Path aliases (@/)

TypeScripttypescript
// Sans alias (imports relatifs pénibles)
import { Utilisateur } from "../../../models/utilisateur"
import { api } from "../../../../services/api"

// Avec alias dans tsconfig.json
// "paths": { "@/*": ["./src/*"] }

// Imports propres !
import { Utilisateur } from "@/models/utilisateur"
import { api } from "@/services/api"

// Autres alias utiles
// "paths": {
//   "@components/*": ["./src/components/*"],
//   "@hooks/*": ["./src/hooks/*"],
//   "@utils/*": ["./src/utils/*"]
// }

Verifie tes acquis

3 questions pour valider ce chapitre

1. Quelle est la difference entre import et import type en TypeScript ?

Valide et sauvegarde ce chapitre

Ne perds pas le fil de ton apprentissage. Chaque QCM terminé sauvegarde ton score. Crée ton profil gratuitement pour débloquer toutes les évaluations du site et retrouver tes résultats plus tard.

Commencer l'aventure
Déjà membre ?Connecte-toi