Avez-vous une question? (216) 97 656 803 hajjriadh@gmail.com
JavaScript

Introduction à TypeScript

Découvrez TypeScript, le JavaScript typé utilisé par Angular et la plupart des projets professionnels : types de base, inférence, unions, typage des fonctions, interfaces et alias de type, premiers gé...

0 chapitres 0 QCM Accès gratuit
Dans cet article

À propos de ce cours

Découvrez TypeScript, le JavaScript typé utilisé par Angular et la plupart des projets professionnels : types de base, inférence, unions, typage des fonctions, interfaces et alias de type, premiers génériques, installation de TypeScript 7, configuration de tsconfig.json, lecture des erreurs du compilateur et exécution des fichiers .ts avec Node.js et Vite. Avec des exemples testés et des activités corrigées.
  1. Objectifs

    • Comprendre ce que TypeScript ajoute à JavaScript et pourquoi il est utilisé en entreprise.
    • Typer des variables, des fonctions, des tableaux et des objets (interfaces, types, unions).
    • Installer TypeScript, configurer tsconfig.json et lire les erreurs du compilateur.
    • Exécuter du TypeScript avec Node.js et l'utiliser dans un projet Vite.
  2. Qu'est-ce que TypeScript ?

    • TypeScript est un langage créé par Microsoft en 2012. C'est un sur-ensemble de JavaScript : tout code JavaScript est du TypeScript valide, auquel on ajoute des annotations de type.
    • Le navigateur ne comprend pas TypeScript : le code est vérifié puis transformé en JavaScript (on dit « transpilé ») avant d'être exécuté.
    • Son intérêt : détecter les erreurs pendant l'écriture, avant que l'utilisateur ne les rencontre. VS Code s'en sert aussi pour l'autocomplétion et le renommage.
    • Angular est entièrement écrit en TypeScript, et la plupart des projets React et Vue professionnels l'utilisent.
    • En 2026, TypeScript 7 a remplacé le compilateur écrit en JavaScript par un compilateur natif (réécrit en langage Go), environ dix fois plus rapide sur les gros projets. Pour vous, la syntaxe ne change pas.

    TypeScript : annotations de type, erreurs détectées avant l'exécution et transpilation en JavaScript

  3. Le même bug en JavaScript et en TypeScript

  4. // JavaScript : aucune alerte, le bug apparaît seulement à l'exécution
    function calculerMoyenne(notes) {
      return notes.reduce((a, b) => a + b, 0) / notes.length;
    }
    calculerMoyenne("15"); // TypeError: notes.reduce is not a function
    // TypeScript : l'erreur est signalée dès l'écriture, en rouge dans VS Code
    function calculerMoyenne(notes: number[]): number {
      return notes.reduce((a, b) => a + b, 0) / notes.length;
    }
    calculerMoyenne("15");
    // error TS2345: Argument of type 'string' is not assignable to parameter of type 'number[]'.
  5. Les types de base

  6. let nom: string = "Sami";
    let age: number = 19;
    let estInscrit: boolean = true;
    let notes: number[] = [14, 15, 9];
    let groupes: Array<string> = ["DEV101", "DEV102"];
    
    // L'inférence : TypeScript devine le type, inutile de l'écrire partout
    let ville = "Sfax";   // string
    ville = 42;           // error TS2322: Type 'number' is not assignable to type 'string'.
    
    // Union : plusieurs types possibles, ou une liste de valeurs autorisées
    let identifiant: number | string = 105;
    let niveau: "débutant" | "intermédiaire" | "avancé" = "débutant";
    
    // any désactive la vérification : à éviter. unknown oblige à vérifier le type avant usage.
    let donnee: unknown = JSON.parse('{"x": 1}');
  7. Typer les fonctions

  8. // Paramètres et valeur de retour
    function formaterNote(note: number, sur: number = 20): string {
      return `${note.toFixed(2)} / ${sur}`;
    }
    
    // Paramètre facultatif (?) et fonction sans valeur de retour (void)
    function saluer(prenom: string, titre?: string): void {
      console.log(`Bonjour ${titre ?? ""} ${prenom}`.trim());
    }
    
    // Fonction fléchée
    const doubler = (n: number): number => n * 2;
  9. Décrire des objets : interface et type

  10. interface Stagiaire {
      nom: string;
      groupe: string;
      notes: number[];
      email?: string;
    }
    
    type Decision = "Admis" | "Ajourné";
    
    const SEUIL_ADMISSION = 10;
    
    function calculerMoyenne(notes: number[]): number {
      if (notes.length === 0) {
        return 0;
      }
      const total = notes.reduce((somme, note) => somme + note, 0);
      return total / notes.length;
    }
    
    function obtenirDecision(moyenne: number): Decision {
      return moyenne >= SEUIL_ADMISSION ? "Admis" : "Ajourné";
    }
    
    const sami: Stagiaire = { nom: "Sami", groupe: "DEV101", notes: [14, 15, 9] };
    const moyenne = calculerMoyenne(sami.notes);
    console.log(`${sami.nom} : ${moyenne.toFixed(2)} → ${obtenirDecision(moyenne)}`);
  • Une interface décrit la forme d'un objet ; ? rend une propriété facultative.
  • Un alias type peut nommer n'importe quel type, notamment une union : type Decision = "Admis" | "Ajourné".
  • Si on oublie une propriété obligatoire, qu'on se trompe de type ou de nom, le compilateur le signale :
const rim: Stagiaire = { nom: "Rim", groupe: "DEV101", notes: ["17", 16] };
// error TS2322: Type 'string' is not assignable to type 'number'.
console.log(rim.prenom);
// error TS2339: Property 'prenom' does not exist on type 'Stagiaire'.
  • Un premier aperçu des génériques

  • // T est un « type paramètre » : la fonction marche pour n'importe quel tableau
    function premier<T>(liste: T[]): T | undefined {
      return liste[0];
    }
    
    const n = premier([14, 15, 9]);       // number | undefined
    const s = premier(["Sami", "Rim"]);   // string | undefined
    1. Installer et configurer TypeScript

    2. npm install --save-dev typescript
      npx tsc --version   # Version 7.0.x
    • Le fichier tsconfig.json règle le compilateur. Une configuration simple pour vérifier des fichiers .ts exécutés par Node.js :
    {
      "compilerOptions": {
        "target": "es2022",
        "module": "nodenext",
        "strict": true,
        "noEmit": true,
        "erasableSyntaxOnly": true,
        "verbatimModuleSyntax": true,
        "skipLibCheck": true
      },
      "include": ["*.ts"]
    }
    • "strict": true active toutes les vérifications importantes : gardez-le toujours.
    • "noEmit": true: le compilateur vérifie sans produire de fichiers (c'est Node.js ou Vite qui exécutent le code).
    • "erasableSyntaxOnly": true interdit les rares syntaxes TypeScript qui ne sont pas de simples annotations (comme enum), pour que le code reste exécutable directement par Node.js.
    • Vérification : npx tsc. Résultat sur un fichier avec des erreurs :
    erreurs.ts(8,46): error TS2322: Type 'string' is not assignable to type 'number'.
    erreurs.ts(9,17): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number[]'.
    erreurs.ts(10,17): error TS2339: Property 'prenom' does not exist on type 'Stagiaire'.
  • Exécuter du TypeScript

    • Avec Node.js (version 22.18 ou plus récente, dont Node.js 26 LTS) : node notes.ts fonctionne directement. Node.js efface les annotations, mais ne vérifie pas les types : un fichier plein d'erreurs de type s'exécute quand même… et plante. Il faut donc lancer npx tsc pour vérifier.
    • Avec Vite: le modèle vanilla-ts crée un projet prêt à l'emploi (npm create vite@latest mon-app -- --template vanilla-ts). Vite transforme les .ts à la volée et le script build lance aussi la vérification avec tsc.
    • Dans le DOM, TypeScript connaît les types des éléments :
    const champ = document.querySelector<HTMLInputElement>("#recherche");
    if (champ) {                     // querySelector peut renvoyer null
      console.log(champ.value.trim());
    }
  • Activités

  • Activité 1 : repérer les erreurs

    • Sans exécuter, indiquez les lignes qui provoquent une erreur TypeScript et pourquoi, puis vérifiez avec npx tsc:
    let total: number = 0;
    total = "10";
    const groupes: string[] = ["DEV101", 102];
    function aire(largeur: number, hauteur: number): number {
      return largeur * hauteur;
    }
    aire(4);
    const resultat: string = aire(2, 3);

    Activité 2 : typer le bulletin

    • Dans un dépôt GitHub js-typescript, installez TypeScript avec la configuration de la leçon. Recopiez notes.ts, exécutez-le avec node notes.ts puis vérifiez avec npx tsc.
    • Ajoutez une interface Groupe (code, formateur, stagiaires: Stagiaire[]) et une fonction moyenneDuGroupe(groupe: Groupe): number.

    Activité 3 : exécuté mais faux

    • Introduisez volontairement une erreur de type dans notes.ts. Que se passe-t-il avec node notes.ts? Et avec npx tsc? Concluez sur le rôle de chacun.

    Activité 4 : un projet Vite en TypeScript

    • Créez un projet avec le modèle vanilla-ts. Ajoutez une fonction typée qui affiche une liste de cours (interface Cours) dans la page.
    Corrigé de l'activité 1. Ligne 2 : une chaîne n'est pas un number (TS2322). Ligne 3 : 102 n'est pas une string (TS2322). Ligne 7 : il manque un argument (TS2554 : Expected 2 arguments, but got 1). Ligne 8 : la fonction renvoie un number, pas une string (TS2322).
    Activité 3 : Node.js exécute le fichier sans vérifier les types (il peut planter ou donner un résultat faux) ; tsc signale l'erreur sans exécuter. On utilise les deux : tsc pour vérifier, Node.js ou Vite pour exécuter.
  • À retenir

    • TypeScript = JavaScript + types, vérifiés avant l'exécution.
    • On type les paramètres et les retours des fonctions, et on décrit les objets avec interface ou type.
    • tsc vérifie ; Node.js (22.18 et plus) et Vite exécutent en effaçant les types.
    • "strict": true toujours ; any le moins possible.

    Sources : nodejs.org, docs.npmjs.com, vite.dev, typescriptlang.org, angular.dev, react.dev, vuejs.org, MDN Web Docs.