Types, interfaces et annotations
⏱ 55 minTypeScript = JavaScript + types statiques. Le compilateur détecte les erreurs avant même d'exécuter le code.
Pourquoi TypeScript ?
// ❌ JavaScript : l'erreur n'apparaît qu'à l'exécution
function calculerXP(leçons) {
return leçons * 50; // crash si leçons est undefined
}
// ✅ TypeScript : l'erreur est détectée à la compilation
function calculerXP(leçons: number): number {
return leçons * 50; // TypeScript garantit que leçons est un nombre
}
calculerXP("cinq"); // ❌ Erreur : Argument of type 'string' not assignable to 'number'
Types primitifs
let nom: string = "Emile";
let xp: number = 250;
let estConnecté: boolean = true;
let progression: number[] = [10, 20, 30];
let tuple: [string, number] = ["py-1", 50]; // tuple : types fixes par position
// Union — plusieurs types possibles
let id: string | number = "abc123";
id = 42; // ✅ aussi valide
// Littéral — valeurs exactes autorisées
type Niveau = "debutant" | "intermediaire" | "avance";
let niveau: Niveau = "debutant";
niveau = "expert"; // ❌ Erreur : pas dans l'union
Interfaces — contrats pour les objets
interface Leçon {
id: string;
title: string;
duration: string;
content: string;
completed?: boolean; // ? = propriété optionnelle
}
interface Module {
id: string;
title: string;
level: Niveau;
icon: string;
lessons: Leçon[]; // tableau d'interfaces imbriquées
quiz: Question[];
}
interface Question {
q: string;
options: string[];
answer: number;
explain: string;
}
// TypeScript vérifie la structure à chaque usage
const module: Module = {
id: "typescript",
title: "TypeScript",
level: "intermediaire",
icon: "🔷",
lessons: [],
quiz: [],
};
Type vs Interface
// Interface : extensible (recommandée pour les objets)
interface Utilisateur {
id: string;
email: string;
}
interface UtilisateurAvecXP extends Utilisateur {
xp: number;
}
// Type : flexible, supporte les unions et intersections
type ID = string | number;
type UtilisateurComplet = Utilisateur & { xp: number }; // intersection
Inférence de type — TypeScript devine souvent le type :
const score = 85; // inféré : number
const modules = ["py", "ml"]; // inféré : string[]
const data = { xp: 100 }; // inféré : { xp: number }
// Plus besoin d'annoter quand c'est évident
const double = (n: number) => n * 2; // retour inféré : number
Ressource : TypeScript Handbook — https://www.typescriptlang.org/docs/handbook/intro.html
📚 Pour aller plus loin
🧪 Exercice
✍️ Exercices de la leçon
2 exercicesFais-les dans l'ordre, dans un vrai fichier .py — pas dans ta tête. Ne déplie la correction qu'après avoir écrit quelque chose, même faux.
Exercice A — Typer un module de cours
Application directe · Tu appliques ce que tu viens de lire.
Écris les types d'un module de formation :
- 1.un type
Niveaulimité à"debutant" | "intermediaire" | "avance" - 2.une interface
Lecon:id,titre,duree,contenu, ettermineeoptionnelle - 3.une interface
Module:id,titre,niveau, un tableau deLecon, et une icône - 4.une fonction
dureeTotale(module: Module): numberqui additionne les durées
Puis fais échouer le compilateur volontairement de trois façons différentes, et note le message d'erreur à chaque fois.
Le point 5 est le plus instructif : apprendre à lire les erreurs de TypeScript vaut plus que connaître sa syntaxe.
Exercice B — Les trois bugs que le typage révèle
Page blanche · Aucun squelette : à toi de choisir la méthode.
Page blanche. Migration et démonstration.
Ce code JavaScript est en production. Il contient au moins trois bugs latents :
function calculerProgression(utilisateur, modules) {
const total = modules.reduce((n, m) => n + m.lecons.length, 0);
const faites = utilisateur.leconsTerminees.length;
const pourcentage = (faites / total) * 100;
return {
pourcentage: pourcentage.toFixed(1),
restantes: total - faites,
niveau: NIVEAUX[utilisateur.niveau].label,
prochainBadge: BADGES.find((b) => b.seuil > faites).nom,
};
}
- 1.ajoute les types — sans modifier la logique
- 2.note chaque erreur que le compilateur remonte
- 3.classe-les : lesquelles étaient de vrais bugs, lesquelles sont du bruit ?
- 4.corrige les vrais bugs
- 5.dis ce que TypeScript n'aurait pas attrapé ici — il y a au moins un problème qui lui échappe
Le point 5 est le plus important. TypeScript n'est pas un filet complet, et croire l'inverse est dangereux.