← Web Dev
🔷

TypeScript : JavaScript avec des super-pouvoirs

Intermédiaire
🧠Comprendre en lisant n'est pas savoir écrire.🧠Un module est fini quand tu peux le reproduire fenêtre fermée.🧠Écris le problème en français avant d'écrire du code.🧠Une question impossible cache trois questions faciles.🧠Retape le code à la main. Puis referme et réécris-le.🧠Essaie d'abord, cherche ensuite.🧠Cherche « comment on écrit ça », jamais « qu'est-ce que je dois faire ».🧠Pour comprendre du code, casse-le.⌨️Une fonction qui plante sur un cas limite n'est pas finie.⌨️Si un bloc a un nom clair, il mérite d'être une fonction.⌨️Savoir lire une erreur vaut plus que connaître dix méthodes.⌨️Diagnostiquer, c'est éliminer dans l'ordre — pas essayer au hasard.⌨️Une optimisation sans mesure avant/après est une croyance.🔍Regarde le fichier avant de le charger.🔍Une performance anormalement bonne est une hypothèse à réfuter.🔍Cette valeur existe-t-elle à l'instant où je dois prédire ?🔍fit sur le train, transform partout.🔍Un chiffre qu'on ne sait pas raconter est un chiffre qu'on n'a pas compris.🔍Un graphique sans question n'a rien à dire.🤖Un score d'entraînement parfait n'est jamais une bonne nouvelle.🤖Le jeu de test ne se regarde qu'une fois.🤖Plus tu essaies de configurations, plus ton meilleur score est optimiste.🤖Un seuil de décision est un arbitrage économique, pas un réglage technique.🤖Commence toujours par une baseline. Note son score.🤖Le meilleur modèle n'est pas le plus précis, c'est celui qu'on peut maintenir.🚀Un modèle en production n'est pas un livrable, c'est un système vivant.🚀Un secret publié est un secret compromis.🚀Pour chaque permission : que se passe-t-il si cette machine est compromise ?🚀Un post-mortem qui cherche un coupable ne produit aucune amélioration.🚀« Nous n'utilisons pas cette variable » n'est pas une garantie d'équité.🚀Rends l'arbitrage explicite et chiffré. Ne le tranche pas en silence.🚀Un résultat qu'on ne sait pas reproduire est une anecdote.

🎯 Objectifs d'apprentissage

À l'issue de ce module, tu seras capable de :

  • 01Typer une base de code JavaScript existante en mode strict
  • 02Utiliser génériques et types utilitaires à bon escient
  • 03Valider des données externes à l'exécution avec Zod

Prérequis

Module JavaScript

Types, interfaces et annotations

55 min

TypeScript = 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

✍️ Exercices de la leçon

2 exercices

Fais-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 ATyper un module de cours

Application directe · Tu appliques ce que tu viens de lire.

Écris les types d'un module de formation :

  1. 1.un type Niveau limité à "debutant" | "intermediaire" | "avance"
  2. 2.une interface Lecon : id, titre, duree, contenu, et terminee optionnelle
  3. 3.une interface Module : id, titre, niveau, un tableau de Lecon, et une icône
  4. 4.une fonction dureeTotale(module: Module): number qui 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 BLes 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. 1.ajoute les types — sans modifier la logique
  2. 2.note chaque erreur que le compilateur remonte
  3. 3.classe-les : lesquelles étaient de vrais bugs, lesquelles sont du bruit ?
  4. 4.corrige les vrais bugs
  5. 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.

🤖

Question sur cette leçon ? Clique sur 💬 Demander au tuteur en bas à droite.