c · TypeScript, les bases
- Environ 45 minutes
- 4 exercices
TypeScript ajoute des types au JavaScript. Il ne s’exécute pas directement : un compilateur (tsc) le transforme en JavaScript, en vérifiant au passage que les types sont respectés. L’intérêt : une erreur comme appeler .toUpperCase() sur un nombre est détectée avant même de lancer le programme, pas en production. NestJS est entièrement écrit en TypeScript.
Installer TypeScript
Section intitulée « Installer TypeScript »Dans un dossier de ton choix, installe le compilateur :
npm install --save-dev typescriptÉcris ensuite un fichier .ts, compile-le, puis exécute le JavaScript obtenu :
npx tsc mon-fichier.tsnode mon-fichier.jsPas besoin de tsconfig.json pour ces exercices : sans lui, tsc compile un seul fichier avec des réglages par défaut qui conviennent très bien. Tu en créeras un avec la CLI NestJS, en partie 3 — ses propres réglages remplaceront ceux-ci.
Types de base
Section intitulée « Types de base »const pseudo: string = 'Clémence';const tour: number = 3;const estVivant: boolean = true;const joueurs: string[] = ['Clémence', 'Yanis'];En pratique, tu écriras rarement ces annotations sur de simples variables : TypeScript infère le type depuis la valeur. Les annotations deviennent utiles sur les paramètres de fonction, que TypeScript ne peut pas deviner :
function crier(message: string): string { return message.toUpperCase();}Ici, string avant les deux-points type le paramètre message, et celui après les parenthèses type ce que la fonction renvoie.
Unions et alias de type
Section intitulée « Unions et alias de type »Une union autorise plusieurs types possibles, avec | :
type Role = 'loup-garou' | 'villageois' | 'voyante' | null;Role est un alias de type : un nom réutilisable pour un type, ici une liste fermée de valeurs possibles (plus quelques fautes de frappe en moins que si role était juste string).
Les interfaces
Section intitulée « Les interfaces »Une interface décrit la forme d’un objet : quels champs, avec quels types.
interface Joueur { pseudo: string; role: Role; votes?: number; // le ? rend le champ optionnel}
function presenter(joueur: Joueur): string { return `${joueur.pseudo} (${joueur.role ?? 'rôle inconnu'})`;}Si tu appelles presenter({ pseudo: 'Clémence' }), sans role, TypeScript refuse de compiler : role n’est pas optionnel dans l’interface. C’est le genre d’erreur que tu préfères voir tout de suite plutôt qu’en pleine partie.
Exercices 1.8 à 1.11
Écris une interface Village avec un champ nom (string) et un champ joueurs (un tableau de Joueur, l’interface ci-dessus). Écris une fonction compterLoups(village: Village): number qui renvoie le nombre de joueurs dont le role vaut 'loup-garou'.
Ce fichier ne compile pas. Corrige les annotations de type sans changer le comportement :
function ajouterVote(votes: string): number { return votes + 1;}Déclare un alias de type Phase : 'jour' | 'nuit'. Écris une fonction phaseSuivante(phase: Phase): Phase qui renvoie l’autre phase ('jour' donne 'nuit', et inversement). Vérifie que TypeScript refuse phaseSuivante('matin').
Écris une fonction presenterVillage(nom: string, tour?: number): string qui renvoie `${nom}, tour ${tour}` si tour est fourni, et juste nom sinon. Vérifie que l’appeler avec un seul argument compile sans erreur.