📘

TypeScript

Sur-ensemble de JavaScript open source et supportĂ© par n’importe quel navigateur ou OS, dont le code sera compilĂ© en JavaScript avant d’ĂȘtre interprĂ©tĂ©. De plus en plus utilisĂ© !!

Le premier intĂ©rĂȘt par rapport Ă  JavaScript est la possibilitĂ© d’avoir un typage statique, ce qui n’amĂ©liore pas les performances mais amĂ©liore la lisibilitĂ© et la maintenance.

Le second intĂ©rĂȘt est de faire la POO avec TypeScript, qui permet de crĂ©er et utiliser des classes, interfaces, Ă©numĂ©rations, gĂ©nĂ©riques, modules (ou packages).

📌
Pour aller plus loin : https://www.typescriptlang.org/ https://www.typescriptlang.org/docs/handbook/intro.html

Mise en place


Installation via le terminal avec npm -g install typescript.

Transcompilation via le terminal avec npx tsc nomDuFichier.ts : cela va créer un fichier JavaScript (nomDuFichier.js).

â„č
La transcompilation est la compilation du TypeScript en JavaScript. Elle est faite par le tsc (TypeScript Compiler) par “suppression” des ajouts du TypeScript. Exemple : let varTypee: string = “une string”; en TypeScript deviendra var varTypee = “une string”; en JavaScript.

Utilisation du TypeScript


Variables typées

La déclaration des variables se fait en précisant le type aprÚs le nom de la variable avec deux-points : let unBooleen: boolean = true;.

Les principaux types primitifs sont string, number et boolean, que l’on peut utiliser pour crĂ©er des tableaux avec number[] ou Array<number>.

Il existe un type spécial, any, qui permet de supprimer la vérification de type sur la variable et ne renvoie donc aucune erreur.

⚠
Si une variable est dĂ©clarĂ©e sans type (comme en JavaScript) et que le TypeScript n’arrive pas Ă  lui infĂ©rer dynamiquement un type, alors celui-ci sera automatiquement any.

ÉnumĂ©rations

// declaration
enum JoursSemaine { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche };

// utilisation
let jourDuMarche: JoursSemaine = JoursSemaine.Mardi;

Classes

// declaration d'une classe
class Livre {
	protected isbn: number;
	protected titre: string;
	protected auteur: string;

	constructor(titre: string, auteur: string) {
		this.titre = titre;
		this.auteur = auteur;
	}

	public afficher():void {
		console.log('Le titre de ce livre est ' + this.titre 
								+ ', son auteur est ' + this.auteur + '.');
	}
}

// instanciation
let unLivre = new Livre("L'existentialisme est un humanisme", "Jean-Paul Sartre");
unLivre.afficher();
//Le titre de ce livre est L'existentialisme est un humanisme, son auteur est Jean-Paul Sartre.
BP : Il est possible de dĂ©clarer les attributs directement le constructeur mais ce n’est pas recommandĂ© car cela diminue la lisibilitĂ© et la maintenabilitĂ©.

Héritage

// declaration d'une classe enfant
class Roman extends Livre {
  private genre: string;

  constructor(titre: string, auteur: string, genre: string) {
      super(titre, auteur);
      this.genre = genre;
  }

  public afficher(): void {
      super.afficher();
      console.log("C'est un roman du genre littéraire " + this.genre + ".");
  }
}

// instanciation
let unRoman = new Roman("Darkest minds","Alexandra Bracken", "Dystopie");
unRoman.afficher();
//Le titre de ce livre est Darkest minds, son auteur est Alexandra Bracken.
//C'est un roman du genre littéraire Dystopie.

Interfaces

“Signature ou contrat d’une classe”.
// declaration d'une interface
interface Vendable {
    // - propriete optionnelle
    promotion?: number;

    etreVendu(librairie: string, nbExemplaires: number): void;
}

// declaration d'une classe qui l'implemente
class PieceDeTheatre extends Livre implements Vendable {
    private premiereRepresentation: number;

    constructor(titre: string, auteur: string, premiereRepresentation: number) {
        super(titre, auteur);
        this.premiereRepresentation = premiereRepresentation;
    }

    public afficher(): void {
        super.afficher();
        console.log("C'est une piÚce de théatre dont la premiÚre représentation eut lieu en "
                    + this.premiereRepresentation + ".");
    }

    // - methode de l'interface a definir
    public etreVendu(librairie: string, nbExemplaires: number): void {
        console.log("La piÚce de théatre " + this.titre
            + " a été vendue par la librairie "
            + librairie + ", " + nbExemplaires + " fois.");
    }
}

// instanciation
let unePiece = new PieceDeTheatre("Les Bonnes", "Jean Genet", 1947);
unePiece.afficher();
//Le titre de ce livre est Les Bonnes, son auteur est Jean Genet.
//C'est une piÚce de théatre dont la premiÚre représentation eut lieu en 1947.
unePiece.etreVendu("Mollat", 152);
//La piÚce de théatre Les Bonnes a été vendue par Mollat, 42 fois.
â„č
Lors de la transpilation, les interfaces TypeScripts disparaissent totalement puisqu’elles ne contiennent pas de code.

Génériques

Un type gĂ©nĂ©rique est indiquĂ© avec la notation diamant <Type> et peut ĂȘtre utilisĂ© par exemple pour crĂ©er un tableau, une fonction ou une classe.

// tableaux
let unTableau: Array<number>;
let unAutreTableau: Array<string>;

// fonctions
function afficherUnMessage<T>(message: T): void {
    console.log("Le message est : " + message);
}
afficherUnMessage("un message en chaine de caractĂšres");
afficherUnMessage(569684);
afficherUnMessage(true);

Modules

Un module est créé avec le mot-clĂ© module, il contient des instructions et des export de n’importe quelle dĂ©claration (variable, fonction, classe, interface
) puis il peut ĂȘtre import dans d’autres fichiers.

Expressions lambdas

Les expressions lambdas sont des fonctions fléchées, elles ne sont pas stockées en mémoire de façon classique mais exécutée à la volée.

let uneExpressionLambda = (a,b) => a+b;
console.log(uneExpressionLambda(5,4)); //9