Skip to content
NestJS OpenPart 1, section c
Change language: read in French

c · TypeScript, les bases

  • About 45 minutes
  • 4 exercises

This content is not available in your language yet.

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.

Dans un dossier de ton choix, installe le compilateur :

Fenêtre de terminal
npm install --save-dev typescript

Écris ensuite un fichier .ts, compile-le, puis exécute le JavaScript obtenu :

Fenêtre de terminal
npx tsc mon-fichier.ts
node mon-fichier.js

Pas 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.

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.

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).

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.

Exercises 1.8 to 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.