TypeScript pour Angular
Achref El Mouelhi
Docteur de l’université d’Aix-Marseille
Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel
[Link]@[Link]
H & H: Research and Training 1 / 142
Plan
1 Introduction
2 Variable
Déclaration
Union de type
Variable locale
Cast
Conversion
Alias de type
Nullish Coalescing (Coalescence nulle)
3 Constante
H & H: Research and Training 2 / 142
Plan
4 Fonction
Déclaration et appel
Paramètres par défaut
Paramètres optionnels
Paramètres restants
Paramètres à plusieurs types autorisés
Paramètres en lecture seule
Fonctions fléchées (arrow function)
5 Concept de décomposition (spread)
6 import / export
H & H: Research and Training 3 / 142
Plan
7 Classe
Rappel
Syntaxe
Setter
Getter
Constructeur
Attributs et méthodes statiques
8 Héritage
9 Classe et méthode abstraites
10 Interface
11 Décorateur
12 Généricité
13 Map
14 Set
H & H: Research and Training 4 / 142
Introduction
TypeScript
ECMAScript
ensemble de normes sur les langages de programmation de type
script (JavaScript, ActionScript...)
standardisée par Ecma International (European Computer
Manufacturers Association) depuis 1994
H & H: Research and Training 5 / 142
Introduction
TypeScript
ECMAScript
ensemble de normes sur les langages de programmation de type
script (JavaScript, ActionScript...)
standardisée par Ecma International (European Computer
Manufacturers Association) depuis 1994
Quelques versions
ECMAScript version 5 (ES5) ou ES 2009
ECMAScript version 6 (ES6) ou ES 2015 (compatible avec les
navigateurs modernes)
H & H: Research and Training 5 / 142
Introduction
TypeScript
TypeScript
langage de programmation
procédural et orienté objet
supportant le typage statique, dynamique et générique
open-source
créé par Anders Hejlsberg (inventeur de C#) de MicroSoft
utilisé par Angular (Google)
H & H: Research and Training 6 / 142
Introduction
TypeScript
TypeScript : sur-couche de ES6 ajoutant
typage
meilleure gestion de module (à ne pas confondre avec les
modules Angular)
TypeScript
ES6
JavaScript
(ES5)
H & H: Research and Training 7 / 142
Introduction
TypeScript
Le navigateur ne comprend pas le TypeScript
Il faut le transcompiler (ou transpiler) en JavaScript
transpiler
[Link] [Link]
H & H: Research and Training 8 / 142
Introduction
TypeScript
Comment va t-on procéder dans ce cours ?
transpiler exécuter
[Link] [Link] résultat
tsc [Link] node [Link]
tsc [Link] | node [Link]
Pour consulter la liste d’ptions pour la commande tsc
[Link]
H & H: Research and Training 9 / 142
Introduction
TypeScript
De quoi on a besoin ?
[Link] pour exécuter la commande node
TypeScript pour exécuter la commande tsc
H & H: Research and Training 10 / 142
Introduction
TypeScript
Pour [Link], il faut
aller sur [Link]
choisir la dernière version, télécharger et installer
H & H: Research and Training 11 / 142
Introduction
TypeScript
Pour [Link], il faut
aller sur [Link]
choisir la dernière version, télécharger et installer
Pour TypeScript, il faut
ouvrir une console (invite de commandes)
lancer la commande npm install -g typescript
vérifier la version avec la commande tsc -v
H & H: Research and Training 11 / 142
Introduction
TypeScript
Quel IDE pour TypeScript (et éventuellement Angular)
Microsoft recommande Visual Studio Code
[Link]/download
H & H: Research and Training 12 / 142
Variable Déclaration
TypeScript
Déclarer une variable
var nomVariable: typeVariable;
H & H: Research and Training 13 / 142
Variable Déclaration
TypeScript
Déclarer une variable
var nomVariable: typeVariable;
Exemple
var x: number;
H & H: Research and Training 13 / 142
Variable Déclaration
TypeScript
Déclarer une variable
var nomVariable: typeVariable;
Exemple
var x: number;
Initialiser une variable
x = 2;
H & H: Research and Training 13 / 142
Variable Déclaration
TypeScript
Déclarer une variable
var nomVariable: typeVariable;
Exemple
var x: number;
Initialiser une variable
x = 2;
Déclarer et initialiser une variable
var x: number = 2;
H & H: Research and Training 13 / 142
Variable Déclaration
TypeScript
Cependant, ceci génère une erreur car une varaible ne change
pas de type
x = "bonjour";
H & H: Research and Training 14 / 142
Variable Déclaration
TypeScript
Quels types pour les variables en TypeScript ?
number pour les nombres (entiers, réels, binaires, décimaux, hexadécimaux...)
string pour les chaı̂nes de caractère
boolean pour les booléens
array pour les tableaux non-statiques (taille variable)
tuple pour les tableaux statiques (taille et type fixes)
object pour les objets
any pour les variables pouvant changer de type dans le programme
enum pour les énumérations (tableau de constantes)
H & H: Research and Training 15 / 142
Variable Déclaration
TypeScript
Quels types pour les variables en TypeScript ?
number pour les nombres (entiers, réels, binaires, décimaux, hexadécimaux...)
string pour les chaı̂nes de caractère
boolean pour les booléens
array pour les tableaux non-statiques (taille variable)
tuple pour les tableaux statiques (taille et type fixes)
object pour les objets
any pour les variables pouvant changer de type dans le programme
enum pour les énumérations (tableau de constantes)
Les types undefined et null du JavaScript sont aussi disponibles.
H & H: Research and Training 15 / 142
Variable Déclaration
TypeScript
Pour les chaı̂nes de caractères, on peut faire
var str1: string = "wick";
var str2: string = ’john’;
H & H: Research and Training 16 / 142
Variable Déclaration
TypeScript
Pour les chaı̂nes de caractères, on peut faire
var str1: string = "wick";
var str2: string = ’john’;
On peut aussi utiliser template strings
var str3: string = ‘Bonjour ${ str2 } ${ str1 }
Que pensez-vous de TypeScript ?
‘;
[Link](str3);
// affiche Bonjour john wick
Que pensez-vous de TypeScript ?
H & H: Research and Training 16 / 142
Variable Déclaration
TypeScript
Pour les chaı̂nes de caractères, on peut faire
var str1: string = "wick";
var str2: string = ’john’;
On peut aussi utiliser template strings
var str3: string = ‘Bonjour ${ str2 } ${ str1 }
Que pensez-vous de TypeScript ?
‘;
[Link](str3);
// affiche Bonjour john wick
Que pensez-vous de TypeScript ?
L’équivalent de faire
var str3: string = "Bonjour " + str2 + " " + str1 + "\nQue
pensez-vous de TypeScript ?";
H & H: Research and Training 16 / 142
Variable Déclaration
TypeScript
Une première déclaration pour les tableaux
var list: number[] = [1, 2, 3];
[Link](list);
// affiche [ 1, 2, 3 ]
H & H: Research and Training 17 / 142
Variable Déclaration
TypeScript
Une première déclaration pour les tableaux
var list: number[] = [1, 2, 3];
[Link](list);
// affiche [ 1, 2, 3 ]
Une deuxième déclaration
var list: Array<number> = new Array(1, 2, 3);
[Link](list);
// affiche [ 1, 2, 3 ]
H & H: Research and Training 17 / 142
Variable Déclaration
TypeScript
Une première déclaration pour les tableaux
var list: number[] = [1, 2, 3];
[Link](list);
// affiche [ 1, 2, 3 ]
Une deuxième déclaration
var list: Array<number> = new Array(1, 2, 3);
[Link](list);
// affiche [ 1, 2, 3 ]
Ou encore plus simple
var list: Array<number> = [1, 2, 3];
[Link](list);
// affiche [ 1, 2, 3 ]
H & H: Research and Training 17 / 142
Variable Déclaration
TypeScript
Remarques
En JavaScript, il n’y a pas de méthode range pour générer un tableau contenant un
intervalle de valeurs entières consécutives.
Avec EcmaScript 6, on peut utiliser des méthodes comme from et keys pour générer un
intervalle de valeurs entières consécutives.
H & H: Research and Training 18 / 142
Variable Déclaration
TypeScript
Remarques
En JavaScript, il n’y a pas de méthode range pour générer un tableau contenant un
intervalle de valeurs entières consécutives.
Avec EcmaScript 6, on peut utiliser des méthodes comme from et keys pour générer un
intervalle de valeurs entières consécutives.
Exemple
var list: number[] = [Link](Array(3).keys())
[Link](list);
// affiche [ 0, 1, 2 ]
H & H: Research and Training 18 / 142
Variable Déclaration
TypeScript
Remarques
En JavaScript, il n’y a pas de méthode range pour générer un tableau contenant un
intervalle de valeurs entières consécutives.
Avec EcmaScript 6, on peut utiliser des méthodes comme from et keys pour générer un
intervalle de valeurs entières consécutives.
Exemple
var list: number[] = [Link](Array(3).keys())
[Link](list);
// affiche [ 0, 1, 2 ]
On peut utiliser une fonction fléchée (à voir dans une prochaine section) pour modifier les
valeurs générées
var list: number[] = [Link]({ length: 3 }, (v, k) => k + 1)
[Link](list);
// affiche [ 1, 2, 3 ]
H & H: Research and Training 18 / 142
Variable Déclaration
TypeScript
Pour les tuples, on initialise toutes les valeurs à la déclaration
var t: [number, string, string] = [ 100, "wick", ’john’ ];
H & H: Research and Training 19 / 142
Variable Déclaration
TypeScript
Pour les tuples, on initialise toutes les valeurs à la déclaration
var t: [number, string, string] = [ 100, "wick", ’john’ ];
Pour accéder à un élément d’un tuple en lecture ou en écriture
[Link](t[0]);
// affiche 100
t[2] = "travolta";
[Link](t);
// affiche [ 100, ’wick’, ’travolta’ ]
H & H: Research and Training 19 / 142
Variable Déclaration
TypeScript
Pour les tuples, on initialise toutes les valeurs à la déclaration
var t: [number, string, string] = [ 100, "wick", ’john’ ];
Pour accéder à un élément d’un tuple en lecture ou en écriture
[Link](t[0]);
// affiche 100
t[2] = "travolta";
[Link](t);
// affiche [ 100, ’wick’, ’travolta’ ]
Cependant, ceci génère une erreur
t = [100, 200, ’john’];
H & H: Research and Training 19 / 142
Variable Déclaration
Avec TypeScript 3.0, on peut rendre certains éléments de tuple optionnels
var t: [number, string?, string?] = [100];
[Link](t);
// affiche [ 100 ]
[Link](t[1]);
// affiche undefined
H & H: Research and Training 20 / 142
Variable Déclaration
Avec TypeScript 3.0, on peut rendre certains éléments de tuple optionnels
var t: [number, string?, string?] = [100];
[Link](t);
// affiche [ 100 ]
[Link](t[1]);
// affiche undefined
Pour ajouter un élément
t[1] = ’wick’;
H & H: Research and Training 20 / 142
Variable Déclaration
Avec TypeScript 3.0, on peut rendre certains éléments de tuple optionnels
var t: [number, string?, string?] = [100];
[Link](t);
// affiche [ 100 ]
[Link](t[1]);
// affiche undefined
Pour ajouter un élément
t[1] = ’wick’;
Ceci génère une erreur
t[2] = 100;
H & H: Research and Training 20 / 142
Variable Déclaration
Avec TypeScript 3.0, on peut rendre certains éléments de tuple optionnels
var t: [number, string?, string?] = [100];
[Link](t);
// affiche [ 100 ]
[Link](t[1]);
// affiche undefined
Pour ajouter un élément
t[1] = ’wick’;
Ceci génère une erreur
t[2] = 100;
Et cette instruction aussi car on dépasse la taille du tuple
t[3] = 100;
H & H: Research and Training 20 / 142
Variable Déclaration
TypeScript
Exemple avec any
var x: any;
x = "bonjour";
x = 5;
[Link](x);
// affiche 5;
H & H: Research and Training 21 / 142
Variable Déclaration
TypeScript
Exemple avec any
var x: any;
x = "bonjour";
x = 5;
[Link](x);
// affiche 5;
Une variable de type any peut être affectée à n’importe quel autre
type de variable
var x: any;
x = "bonjour";
x = 5;
var y: number = x;
H & H: Research and Training 21 / 142
Variable Déclaration
TypeScript
Le type unknown (TypeScript 3.0) fonctionne comme any mais ne
peut être affecté qu’à une variable de type unknown ou any
var x: unknown;
x = "bonjour";
x = 5;
[Link](x);
// affiche 5;
H & H: Research and Training 22 / 142
Variable Déclaration
TypeScript
Le type unknown (TypeScript 3.0) fonctionne comme any mais ne
peut être affecté qu’à une variable de type unknown ou any
var x: unknown;
x = "bonjour";
x = 5;
[Link](x);
// affiche 5;
Ceci génère donc une erreur
var x: unknown;
x = "bonjour";
x = 5;
var y: number = x;
H & H: Research and Training 22 / 142
Variable Déclaration
Déclarons une énumération (dans [Link])
enum mois { JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET,
AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE };
H & H: Research and Training 23 / 142
Variable Déclaration
Déclarons une énumération (dans [Link])
enum mois { JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET,
AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE };
L’indice du premier élément est 0
[Link]([Link])
// affiche 3
H & H: Research and Training 23 / 142
Variable Déclaration
Déclarons une énumération (dans [Link])
enum mois { JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET,
AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE };
L’indice du premier élément est 0
[Link]([Link])
// affiche 3
Pour modifier l’indice du premier élément
enum mois { JANVIER = 1, FEVRIER, MARS, AVRIL, MAI, JUIN,
JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE };
H & H: Research and Training 23 / 142
Variable Déclaration
Déclarons une énumération (dans [Link])
enum mois { JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET,
AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE };
L’indice du premier élément est 0
[Link]([Link])
// affiche 3
Pour modifier l’indice du premier élément
enum mois { JANVIER = 1, FEVRIER, MARS, AVRIL, MAI, JUIN,
JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECEMBRE };
En affichant maintenant, le résultat est
[Link]([Link])
// affiche 4
H & H: Research and Training 23 / 142
Variable Déclaration
TypeScript
On peut aussi modifier plusieurs indices simultanément
enum mois { JANVIER = 1, FEVRIER, MARS, AVRIL = 10, MAI, JUIN,
JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE = 2, DECEMBRE };
H & H: Research and Training 24 / 142
Variable Déclaration
TypeScript
On peut aussi modifier plusieurs indices simultanément
enum mois { JANVIER = 1, FEVRIER, MARS, AVRIL = 10, MAI, JUIN,
JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE = 2, DECEMBRE };
En affichant, le résultat est
[Link]([Link]);
// affiche 3
[Link]([Link]);
// affiche 12
[Link]([Link]);
// affiche 3
H & H: Research and Training 24 / 142
Variable Déclaration
TypeScript
On peut aussi modifier plusieurs indices simultanément
enum mois { JANVIER = 1, FEVRIER, MARS, AVRIL = 10, MAI, JUIN,
JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE = 2, DECEMBRE };
En affichant, le résultat est
[Link]([Link]);
// affiche 3
[Link]([Link]);
// affiche 12
[Link]([Link]);
// affiche 3
Ceci est une erreur, on ne peut modifier une constante
[Link] = 3;
H & H: Research and Training 24 / 142
Variable Déclaration
TypeScript
Pour déclarer un objet
var obj: {
nom: string;
numero: number;
};
H & H: Research and Training 25 / 142
Variable Déclaration
TypeScript
Pour déclarer un objet
var obj: {
nom: string;
numero: number;
};
On peut initialiser les attributs de cet objet
obj = {
nom: ’wick’,
numero: 100
};
[Link](obj);
// affiche { nom: ’wick’, numero: 100 }
[Link](typeof obj);
// affiche object
H & H: Research and Training 25 / 142
Variable Déclaration
TypeScript
On peut modifier les valeurs d’un objet ainsi
[Link] = ’abruzzi’;
obj[’numero’] = 200;
[Link](obj);
H & H: Research and Training 26 / 142
Variable Déclaration
TypeScript
On peut modifier les valeurs d’un objet ainsi
[Link] = ’abruzzi’;
obj[’numero’] = 200;
[Link](obj);
Ceci est une erreur
[Link] = 125;
H & H: Research and Training 26 / 142
Variable Union de type
TypeScript
Union de type
Il est possible d’autoriser plusieurs types de valeurs pour une variable
H & H: Research and Training 27 / 142
Variable Union de type
TypeScript
Union de type
Il est possible d’autoriser plusieurs types de valeurs pour une variable
Déclarer une variable acceptant plusieurs types de valeur
var y: number | boolean | string;
H & H: Research and Training 27 / 142
Variable Union de type
TypeScript
Union de type
Il est possible d’autoriser plusieurs types de valeurs pour une variable
Déclarer une variable acceptant plusieurs types de valeur
var y: number | boolean | string;
affecter des valeurs de type différent
y = 2;
y = "bonjour";
y = false;
H & H: Research and Training 27 / 142
Variable Union de type
TypeScript
Union de type
Il est possible d’autoriser plusieurs types de valeurs pour une variable
Déclarer une variable acceptant plusieurs types de valeur
var y: number | boolean | string;
affecter des valeurs de type différent
y = 2;
y = "bonjour";
y = false;
Ceci génère une erreur
y = [2, 5];
H & H: Research and Training 27 / 142
Variable Variable locale
TypeScript
Le mot-clé let
permet de donner une visibilité locale à une variable déclarée dans un
bloc.
H & H: Research and Training 28 / 142
Variable Variable locale
TypeScript
Le mot-clé let
permet de donner une visibilité locale à une variable déclarée dans un
bloc.
Ceci génère une erreur car la variable x a une visibilité locale
limitée au bloc if
if (5 > 2)
{
let x = 1;
}
[Link](x);
// affiche ReferenceError: x is not defined
H & H: Research and Training 28 / 142
Variable Cast
TypeScript
Premier exemple
let str: any = "bonjour";
let longueur: number = (<string>str).length;
[Link](longueur);
// affiche 7
H & H: Research and Training 29 / 142
Variable Cast
TypeScript
Premier exemple
let str: any = "bonjour";
let longueur: number = (<string>str).length;
[Link](longueur);
// affiche 7
Deuxième exemple
let str: any = "bonjour";
let longueur: number = (str as string).length;
[Link](longueur);
// affiche 7
H & H: Research and Training 29 / 142
Variable Conversion
TypeScript
Pour convertir une chaı̂ne de caractère en nombre
let x : string = "2";
let y: string = "3.5";
let a: number = Number(x);
let b: number = Number(y);
[Link](a);
// affiche 2
[Link](b);
// affiche 3.5
H & H: Research and Training 30 / 142
Variable Conversion
TypeScript
Pour convertir une chaı̂ne de caractère en nombre
let x : string = "2";
let y: string = "3.5";
let a: number = Number(x);
let b: number = Number(y);
[Link](a);
// affiche 2
[Link](b);
// affiche 3.5
Il existe une fonction de conversion pour chaque type
H & H: Research and Training 30 / 142
Variable Alias de type
TypeScript
Le mot-clé type permet de définir un alias de type
type maStructure = [number, string, string];
H & H: Research and Training 31 / 142
Variable Alias de type
TypeScript
Le mot-clé type permet de définir un alias de type
type maStructure = [number, string, string];
Ensuite, on peut utiliser maStructure comme un type
let first: maStructure = [100, "wick", ’john’ ];
[Link](first);
// affiche [ 100, ’wick’, ’john’ ]
H & H: Research and Training 31 / 142
Variable Nullish Coalescing (Coalescence nulle)
TypeScript
L’opérateur ?? permet d’éviter d’affecter la valeur null ou
undefined à une variable
var obj = {nom: null, prenom: ’john’};
let nom: string = [Link] ?? ’doe’;
[Link](nom);
// affiche doe
C’est équivalent à
var obj = {nom: null, prenom: ’john’};
let nom: string = ([Link] !== null && [Link] !==
undefined) ? [Link] : ’doe’;
[Link](nom);
// affiche doe
H & H: Research and Training 32 / 142
Constante
TypeScript
Les constantes
se déclare avec le mot-clé const
permet à une variable de ne pas changer de valeur
H & H: Research and Training 33 / 142
Constante
TypeScript
Les constantes
se déclare avec le mot-clé const
permet à une variable de ne pas changer de valeur
Ceci génère une erreur car une constante ne peut changer de
valeur
const X: any = 5;
X = "bonjour";
// affiche TypeError: Assignment to constant
variable.
H & H: Research and Training 33 / 142
Constante
TypeScript
Avec TypeScript 3.4, on peut définir une constante avec une assertion
sans préciser le type
let X = "bonjour" as const;
[Link](X);
// affiche bonjour
[Link](typeof X);
// affiche string
let Y: string = "bonjour";
[Link](X == y);
//affiche true
H & H: Research and Training 34 / 142
Constante
TypeScript
Avec TypeScript 3.4, on peut définir une constante avec une assertion
sans préciser le type
let X = "bonjour" as const;
[Link](X);
// affiche bonjour
[Link](typeof X);
// affiche string
let Y: string = "bonjour";
[Link](X == y);
//affiche true
Ceci génère une erreur car une constante ne peut changer de valeur
X = "hello";
H & H: Research and Training 34 / 142
Constante
TypeScript
Avec TypeScript 3.4, on peut aussi définir une constante ainsi
let X = <const>"bonjour";
[Link](X);
// affiche bonjour
[Link](typeof X);
// affiche string
let y: string = "bonjour";
[Link](X == y);
//affiche true
H & H: Research and Training 35 / 142
Constante
TypeScript
Avec TypeScript 3.4, on peut aussi définir une constante ainsi
let X = <const>"bonjour";
[Link](X);
// affiche bonjour
[Link](typeof X);
// affiche string
let y: string = "bonjour";
[Link](X == y);
//affiche true
Ceci génère une erreur car une constante ne peut changer de valeur
X = "hello";
H & H: Research and Training 35 / 142
Fonction Déclaration et appel
TypeScript
Déclarer une fonction
function nomFonction([les paramètres]){
les instructions de la fonction
}
H & H: Research and Training 36 / 142
Fonction Déclaration et appel
TypeScript
Déclarer une fonction
function nomFonction([les paramètres]){
les instructions de la fonction
}
Exemple
function somme(a: number, b: number): number {
return a + b;
}
H & H: Research and Training 36 / 142
Fonction Déclaration et appel
TypeScript
Déclarer une fonction
function nomFonction([les paramètres]){
les instructions de la fonction
}
Exemple
function somme(a: number, b: number): number {
return a + b;
}
Appeler une fonction
let resultat: number = somme (1, 3);
[Link](resultat);
// affiche 4
H & H: Research and Training 36 / 142
Fonction Déclaration et appel
TypeScript
Le code suivant génère une erreur
function somme(a: number, b: number): string {
return a + b;
}
H & H: Research and Training 37 / 142
Fonction Déclaration et appel
TypeScript
Le code suivant génère une erreur
function somme(a: number, b: number): string {
return a + b;
}
Celui-ci aussi
let resultat: number = somme ("1", 3);
H & H: Research and Training 37 / 142
Fonction Déclaration et appel
TypeScript
Le code suivant génère une erreur
function somme(a: number, b: number): string {
return a + b;
}
Celui-ci aussi
let resultat: number = somme ("1", 3);
Et même celui-ci
let resultat: string = somme(1, 3);
H & H: Research and Training 37 / 142
Fonction Déclaration et appel
TypeScript
Une fonction qui ne retourne rien a le type void
function direBonjour(): void {
[Link]("bonjour");
}
H & H: Research and Training 38 / 142
Fonction Déclaration et appel
TypeScript
Une fonction qui ne retourne rien a le type void
function direBonjour(): void {
[Link]("bonjour");
}
Une fonction qui n’atteint jamais sa fin a le type never
function boucleInfinie(): never {
while (true){
}
}
H & H: Research and Training 38 / 142
Fonction Paramètres par défaut
TypeScript
Il est possible d’attribuer une valeur par défaut aux paramètres
d’une fonction
H & H: Research and Training 39 / 142
Fonction Paramètres par défaut
TypeScript
Il est possible d’attribuer une valeur par défaut aux paramètres
d’une fonction
function division(x: number, y: number = 1) : number
{
return x / y;
}
[Link](division(10));
// affiche 10
[Link](division(10, 2));
// affiche 5
H & H: Research and Training 39 / 142
Fonction Paramètres optionnels
TypeScript
Il est possible de rendre certains paramètres d’une fonction
optionnels
H & H: Research and Training 40 / 142
Fonction Paramètres optionnels
TypeScript
Il est possible de rendre certains paramètres d’une fonction
optionnels
function division(x: number, y?: number): number {
if(y)
return x / y;
return x;
}
[Link](division(10));
// affiche 10
[Link](division(10, 2));
// affiche 5
H & H: Research and Training 40 / 142
Fonction Paramètres restants
TypeScript
Il est possible de définir une fonction prenant un nombre indéfini de
paramètres
H & H: Research and Training 41 / 142
Fonction Paramètres restants
TypeScript
Il est possible de définir une fonction prenant un nombre indéfini de
paramètres
function somme(x: number, ...tab: number[]): number {
for (let elt of tab)
x += elt;
return x;
}
[Link](somme(10));
// affiche 10
[Link](somme(10, 5));
// affiche 15
[Link](somme(10, 1, 6));
// affiche 17
H & H: Research and Training 41 / 142
Fonction Paramètres à plusieurs types autorisés
TypeScript
Il est possible d’autoriser plusieurs types pour un paramètre
H & H: Research and Training 42 / 142
Fonction Paramètres à plusieurs types autorisés
TypeScript
Il est possible d’autoriser plusieurs types pour un paramètre
function stringOrNumber(param1: string | number,
param2: number): number {
if (typeof param1 == "string")
return [Link] + param2;
return param1 + param2;
}
[Link](stringOrNumber("bonjour", 3));
// affiche 10
[Link](stringOrNumber(5, 3));
// affiche 8
H & H: Research and Training 42 / 142
Fonction Paramètres en lecture seule
TypeScript
Le mot-clé ReadonlyArray (TypeScript 3.4) indique qu’un paramètre de type
tableau est en lecture seule (non-modifiable)
function incrementAll(tab: ReadonlyArray<number>): void {
for (let i = 0; i < [Link]; i++){
// la ligne suivante génère une erreur
tab[i]++;
}
}
H & H: Research and Training 43 / 142
Fonction Paramètres en lecture seule
TypeScript
Le mot-clé ReadonlyArray (TypeScript 3.4) indique qu’un paramètre de type
tableau est en lecture seule (non-modifiable)
function incrementAll(tab: ReadonlyArray<number>): void {
for (let i = 0; i < [Link]; i++){
// la ligne suivante génère une erreur
tab[i]++;
}
}
On peut aussi utiliser le mot-clé readonly qui s’applique sur les tableaux et les
tuples
function incrementAll(tab: readonly number[]): void {
for (let i = 0; i < [Link]; i++){
// la ligne suivante génère une erreur
tab[i]++;
}
}
H & H: Research and Training 43 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Il est possible de déclarer une fonction en utilisant les expressions fléchées
let nomFonction = ([les paramètres]): typeValeurRetour => {
les instructions de la fonction
}
H & H: Research and Training 44 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Il est possible de déclarer une fonction en utilisant les expressions fléchées
let nomFonction = ([les paramètres]): typeValeurRetour => {
les instructions de la fonction
}
Exemple
let somme = (a: number, b: number): number => { return a + b; }
H & H: Research and Training 44 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Il est possible de déclarer une fonction en utilisant les expressions fléchées
let nomFonction = ([les paramètres]): typeValeurRetour => {
les instructions de la fonction
}
Exemple
let somme = (a: number, b: number): number => { return a + b; }
Ou en plus simple
let somme = (a: number, b: number): number => a + b;
H & H: Research and Training 44 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Il est possible de déclarer une fonction en utilisant les expressions fléchées
let nomFonction = ([les paramètres]): typeValeurRetour => {
les instructions de la fonction
}
Exemple
let somme = (a: number, b: number): number => { return a + b; }
Ou en plus simple
let somme = (a: number, b: number): number => a + b;
Appeler une fonction fléchée
let resultat: number = somme (1, 3);
H & H: Research and Training 44 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Cas d’une fonction fléchée à un seul paramètre
let carre = (a: number): number => a * a;
[Link](carre(2)); // affiche 4
H & H: Research and Training 45 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Cas d’une fonction fléchée à un seul paramètre
let carre = (a: number): number => a * a;
[Link](carre(2)); // affiche 4
Sans typage, la fonction peut être écrite ainsi
let carre = a => a * a;
[Link](carre(2)); // affiche 4
H & H: Research and Training 45 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Cas d’une fonction fléchée à un seul paramètre
let carre = (a: number): number => a * a;
[Link](carre(2)); // affiche 4
Sans typage, la fonction peut être écrite ainsi
let carre = a => a * a;
[Link](carre(2)); // affiche 4
Déclaration d’une fonction fléchée sans paramètre
let sayHello = (): void => [Link](’Hello’);
sayHello(); // affiche Hello
H & H: Research and Training 45 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Remarque
Il est déconseillé d’utiliser les fonctions fléchées dans un objet
Le mot-clé this est inutilisable dans les fonctions fléchées
H & H: Research and Training 46 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Remarque
Il est déconseillé d’utiliser les fonctions fléchées dans un objet
Le mot-clé this est inutilisable dans les fonctions fléchées
Sans les fonctions fléchées Avec les fonctions fléchées
let obj = { let obj = {
nom: ’wick’, nom: ’wick’,
afficherNom: function() { afficherNom: () => {
[Link]([Link]) [Link]([Link])
} }
} }
[Link](); [Link]();
// affiche wick // affiche undefined
H & H: Research and Training 46 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Les fonctions fléchées sont utilisées pour réaliser les opérations
suivant sur les tableaux
forEach() : pour parcourir un tableau
map() : pour appliquer une fonction sur les éléments d’un tableau
filter() : pour filtrer les éléments d’un tableau selon un critère
défini sous forme d’une fonction anonyme ou fléchée
reduce() : pour réduire tous les éléments d’un tableau en un
seul selon une règle définie dans une fonction anonyme ou
fléchée
...
H & H: Research and Training 47 / 142
Fonction Fonctions fléchées (arrow function)
Utiliser forEach pour afficher le contenu d’un tableau
var tab = [2, 3, 5];
[Link](elt => [Link](elt));
// affiche 2 3 5
H & H: Research and Training 48 / 142
Fonction Fonctions fléchées (arrow function)
Utiliser forEach pour afficher le contenu d’un tableau
var tab = [2, 3, 5];
[Link](elt => [Link](elt));
// affiche 2 3 5
Dans forEach, on peut aussi appeler une fonction afficher
[Link](elt => afficher(elt));
function afficher(value) {
[Link](value);
}
// affiche 2 3 5
H & H: Research and Training 48 / 142
Fonction Fonctions fléchées (arrow function)
Utiliser forEach pour afficher le contenu d’un tableau
var tab = [2, 3, 5];
[Link](elt => [Link](elt));
// affiche 2 3 5
Dans forEach, on peut aussi appeler une fonction afficher
[Link](elt => afficher(elt));
function afficher(value) {
[Link](value);
}
// affiche 2 3 5
On peut simplifier l’écriture précédente en utilisant les callback
[Link](afficher);
function afficher(value) {
[Link](value);
}
// affiche 2 3 5
H & H: Research and Training 48 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
La fonction afficher peut accepter deux paramètres : le premier
est la valeur de l’itération courante et le deuxième est son indice
dans le tableau
[Link](afficher);
function afficher(value, key) {
[Link](key, value);
}
/* affiche
0 2
1 3
2 5
*/
H & H: Research and Training 49 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
La fonction afficher peut accepter un troisième paramètre qui
correspond au tableau
[Link](afficher);
function afficher(value, key, t) {
[Link](key, value, t);
}
/* affiche
0 2 [ 2, 3, 5 ]
1 3 [ 2, 3, 5 ]
2 5 [ 2, 3, 5 ]
*/
H & H: Research and Training 50 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
On peut utiliser map pour effecteur un traitement sur chaque
élément du tableau puis forEach pour afficher le nouveau
tableau
[Link](elt => elt + 3)
.forEach(elt => [Link](elt));
// affiche 5 6 8
H & H: Research and Training 51 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
On peut utiliser map pour effecteur un traitement sur chaque
élément du tableau puis forEach pour afficher le nouveau
tableau
[Link](elt => elt + 3)
.forEach(elt => [Link](elt));
// affiche 5 6 8
On peut aussi utiliser filter pour filtrer des éléments
[Link](elt => elt + 3)
.filter(elt => elt > 5)
.forEach(elt => [Link](elt));
// affiche 6 8
H & H: Research and Training 51 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Remarque
Attention, selon l’ordre d’appel de ces méthodes, le résultat peut changer.
H & H: Research and Training 52 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Remarque
Attention, selon l’ordre d’appel de ces méthodes, le résultat peut changer.
Exemple avec reduce : permet de réduire les éléments d’un tableau en
une seule valeur
var tab = [2, 3, 5];
var somme = [Link](elt => elt + 3)
.filter(elt => elt > 5)
.reduce((sum, elt) => sum + elt);
[Link](somme);
// affiche 14
H & H: Research and Training 52 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Si on a plusieurs instructions, on doit ajouter les accolades
var tab = [2, 3, 5];
var somme = [Link](elt => elt + 3)
.filter(elt => elt > 5)
.reduce((sum, elt) => {
return sum + elt;
}
);
[Link](somme);
// affiche 14
H & H: Research and Training 53 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Remarques
Le premier paramètre de reduce correspond au résultat de
l’itération précédente
Le deuxième correspond à l’élément du tableau de l’itération
courante
Le premier paramètre est initialisé par la valeur du premier
élément du tableau
On peut changer la valeur initiale du premier paramètre en
l’ajoutant à la fin de la méthode
H & H: Research and Training 54 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Dans cet exemple, on initialise le premier paramètre de reduce
par la valeur 0
var somme = [Link](elt => elt + 3)
.filter(elt => elt > 5)
.reduce((sum, elt) => sum + elt, 0);
[Link](somme);
// affiche 14
H & H: Research and Training 55 / 142
Fonction Fonctions fléchées (arrow function)
TypeScript
Fonctions fléchées : pourquoi ?
Simplicité d’écriture du code ⇒ meilleure lisibilité
Pas de binding avec les objets prédéfinis : arguments, this...
...
H & H: Research and Training 56 / 142
Concept de décomposition (spread)
Considérons la fonction somme suivante
function somme(a?: number, b?: number, c?: number): number {
return a + b + c;
}
H & H: Research and Training 57 / 142
Concept de décomposition (spread)
Considérons la fonction somme suivante
function somme(a?: number, b?: number, c?: number): number {
return a + b + c;
}
Pour appeler la fonction somme, il faut lui passer trois paramètres number
[Link](somme (1, 3, 5));
// affiche 9
H & H: Research and Training 57 / 142
Concept de décomposition (spread)
Considérons la fonction somme suivante
function somme(a?: number, b?: number, c?: number): number {
return a + b + c;
}
Pour appeler la fonction somme, il faut lui passer trois paramètres number
[Link](somme (1, 3, 5));
// affiche 9
Et si les valeurs se trouvent dans un tableau, on peut utiliser la décomposition
let t: Array<number> = [1, 3, 5];
[Link](somme(...t));
H & H: Research and Training 57 / 142
Concept de décomposition (spread)
Considérons la fonction somme suivante
function somme(a?: number, b?: number, c?: number): number {
return a + b + c;
}
Pour appeler la fonction somme, il faut lui passer trois paramètres number
[Link](somme (1, 3, 5));
// affiche 9
Et si les valeurs se trouvent dans un tableau, on peut utiliser la décomposition
let t: Array<number> = [1, 3, 5];
[Link](somme(...t));
On peut utiliser partiellement la décomposition
let t: Array<number> = [1, 3];
[Link](somme(...t, 5));
H & H: Research and Training 57 / 142
Concept de décomposition (spread)
TypeScript
Considérons les deux objets suivants
let obj = { nom: ’wick’, prenom: ’john’};
let obj2 = obj;
H & H: Research and Training 58 / 142
Concept de décomposition (spread)
TypeScript
Considérons les deux objets suivants
let obj = { nom: ’wick’, prenom: ’john’};
let obj2 = obj;
Modifier l’un ⇒ modifier l’autre
[Link] = ’abruzzi’;
[Link](obj);
// affiche { nom: ’abruzzi’, prenom: ’john’ }
[Link](obj2);
// affiche { nom: ’abruzzi’, prenom: ’john’ }
H & H: Research and Training 58 / 142
Concept de décomposition (spread)
TypeScript
Pour que les deux objets soient indépendants, on peut utiliser la
décomposition pour faire le clonage
let obj = { nom: ’wick’, prenom: ’john’};
let obj2 = { ...obj };
[Link] = ’abruzzi’;
[Link](obj);
// affiche { nom: ’wick’, prenom: ’john’ }
[Link](obj2);
// affiche { nom: ’abruzzi’, prenom: ’john’ }
H & H: Research and Training 59 / 142
import / export
TypeScript
Particularité
Avec TypeScript, on peut utiliser des éléments définis dans un
autre fichier : une variable, une fonction, une classe, une
interface...
Pour cela, il faut l’importer là où on a besoin de l’utiliser
Pour importer un élément, il faut l’exporter dans le fichier source
En transpilant le fichier contenant les import, les fichiers
contenant les éléments importés seront aussi transpilés.
H & H: Research and Training 60 / 142
import / export
TypeScript
Étant donné le fichier [Link] dont le contenu est
function somme(a: number = 0, b: number = 0) {
return a + b;
}
function produit(a: number = 0, b: number = 1) {
return a * b;
}
H & H: Research and Training 61 / 142
import / export
TypeScript
Pour exporter les deux fonctions somme et produit de [Link]
export function somme(a: number = 0, b: number = 0) {
return a + b;
}
export function produit(a: number = 0, b: number = 1) {
return a * b;
}
H & H: Research and Training 62 / 142
import / export
TypeScript
Pour exporter les deux fonctions somme et produit de [Link]
export function somme(a: number = 0, b: number = 0) {
return a + b;
}
export function produit(a: number = 0, b: number = 1) {
return a * b;
}
Ou aussi
function somme(a:number = 0, b:number = 0) {
return a + b;
}
function produit(a: number = 0, b: number = 1) {
return a * b;
}
export { somme, produit };
H & H: Research and Training 62 / 142
import / export
TypeScript
Pour importer et utiliser une fonction
import { somme } from ’./fonctions’;
[Link](somme(2, 5));
// affiche 7
H & H: Research and Training 63 / 142
import / export
TypeScript
Pour importer et utiliser une fonction
import { somme } from ’./fonctions’;
[Link](somme(2, 5));
// affiche 7
On peut aussi utiliser des alias
import { somme as s } from ’./fonctions’;
[Link](s(2, 5));
// affiche 7
H & H: Research and Training 63 / 142
import / export
TypeScript
Pour importer plusieurs éléments
import { somme, produit } from ’./fonctions’;
[Link](somme(2, 5));
// affiche 7
[Link](produit(2, 5));
// affiche 10
H & H: Research and Training 64 / 142
import / export
TypeScript
Pour importer plusieurs éléments
import { somme, produit } from ’./fonctions’;
[Link](somme(2, 5));
// affiche 7
[Link](produit(2, 5));
// affiche 10
Pour importer plusieurs éléments
import * as f from ’./fonctions’;
[Link]([Link](2, 5));
// affiche 7
[Link]([Link](2, 5));
// affiche 10
H & H: Research and Training 64 / 142
import / export
TypeScript
On peut aussi donner des alias pendant l’export
function somme(a:number = 0, b:number = 0) {
return a + b;
}
function produit(a: number = 0, b: number = 1) {
return a * b;
}
export { produit as p, somme as s } ;
H & H: Research and Training 65 / 142
import / export
TypeScript
On peut aussi donner des alias pendant l’export
function somme(a:number = 0, b:number = 0) {
return a + b;
}
function produit(a: number = 0, b: number = 1) {
return a * b;
}
export { produit as p, somme as s } ;
Pour importer
import * as f from ’./fonctions’;
[Link](f.s(2, 5));
// affiche 7
[Link](f.p(2, 5));
// affiche 10
H & H: Research and Training 65 / 142
import / export
TypeScript
On peut aussi utiliser le export default (un seul par fichier)
export default function somme(a: number = 0, b: number = 0) {
return a + b;
}
export function produit(a: number = 0, b: number = 1) {
return a * b;
}
H & H: Research and Training 66 / 142
import / export
TypeScript
On peut aussi utiliser le export default (un seul par fichier)
export default function somme(a: number = 0, b: number = 0) {
return a + b;
}
export function produit(a: number = 0, b: number = 1) {
return a * b;
}
Pour importer, pas besoin de { } pour les éléments exporter par défaut
import somme from ’./fonctions’;
import { produit } from ’./fonctions’;
[Link](somme(2, 5));
// affiche 7
[Link](produit(2, 5));
// affiche 10
H & H: Research and Training 66 / 142
import / export
TypeScript
Attention, ici on a importé somme avec deux alias différents
import s from ’./fonctions’;
import produit from ’./fonctions’;
[Link](s(2, 5));
// affiche 7
[Link](produit(2, 5));
// affiche 7
H & H: Research and Training 67 / 142
Classe Rappel
TypeScript
Qu’est ce qu’une classe en POO ?
Ça correspond à un plan, un moule, une usine...
C’est une description abstraite d’un type d’objets
Elle représente un ensemble d’objets ayant les mêmes propriétés
statiques (attributs) et dynamiques (méthodes)
H & H: Research and Training 68 / 142
Classe Rappel
TypeScript
Qu’est ce qu’une classe en POO ?
Ça correspond à un plan, un moule, une usine...
C’est une description abstraite d’un type d’objets
Elle représente un ensemble d’objets ayant les mêmes propriétés
statiques (attributs) et dynamiques (méthodes)
Instance ?
Une instance correspond à un objet créé à partir d’une classe (via
le constructeur)
L’instanciation : création d’un objet d’une classe
instance ≡ objet
H & H: Research and Training 68 / 142
Classe Rappel
TypeScript
De quoi est composé une classe ?
NomClasse
les attributs
les méthodes
Attribut : [visibilité] + nom + type
Méthode : [visibilité] + nom + arguments + valeur de retour ≡
signature : exactement comme les fonctions en procédurale
H & H: Research and Training 69 / 142
Classe Syntaxe
TypeScript
Considérons la classe Personne définie dans [Link]
export class Personne {
num: number;
nom: string;
prenom: string;
}
H & H: Research and Training 70 / 142
Classe Syntaxe
TypeScript
Considérons la classe Personne définie dans [Link]
export class Personne {
num: number;
nom: string;
prenom: string;
}
En TypeScript
Toute classe a un constructeur par défaut sans paramètre.
Par défaut, la visibilité des attributs est public.
H & H: Research and Training 70 / 142
Classe Syntaxe
TypeScript
Hypothèse
Si on voulait créer un objet de la classe Personne avec les valeurs 1, wick et john
H & H: Research and Training 71 / 142
Classe Syntaxe
TypeScript
Hypothèse
Si on voulait créer un objet de la classe Personne avec les valeurs 1, wick et john
Étape 1 : Commençons par importer la classe Personne dans [Link]
import { Personne } from ’./personne’;
H & H: Research and Training 71 / 142
Classe Syntaxe
TypeScript
Hypothèse
Si on voulait créer un objet de la classe Personne avec les valeurs 1, wick et john
Étape 1 : Commençons par importer la classe Personne dans [Link]
import { Personne } from ’./personne’;
Étape 2 : déclarons un objet (objet non créé)
let personne: Personne;
H & H: Research and Training 71 / 142
Classe Syntaxe
TypeScript
Hypothèse
Si on voulait créer un objet de la classe Personne avec les valeurs 1, wick et john
Étape 1 : Commençons par importer la classe Personne dans [Link]
import { Personne } from ’./personne’;
Étape 2 : déclarons un objet (objet non créé)
let personne: Personne;
Étape 3 : créons l’objet (instanciation) de type Personne (objet créé)
personne = new Personne();
H & H: Research and Training 71 / 142
Classe Syntaxe
TypeScript
Hypothèse
Si on voulait créer un objet de la classe Personne avec les valeurs 1, wick et john
Étape 1 : Commençons par importer la classe Personne dans [Link]
import { Personne } from ’./personne’;
Étape 2 : déclarons un objet (objet non créé)
let personne: Personne;
Étape 3 : créons l’objet (instanciation) de type Personne (objet créé)
personne = new Personne();
On peut faire déclaration + instanciation
let personne: Personne = new Personne();
H & H: Research and Training 71 / 142
Classe Syntaxe
TypeScript
Affectons les valeurs aux différents attributs
[Link] = 1;
[Link] = "wick";
[Link] = "john";
H & H: Research and Training 72 / 142
Classe Syntaxe
TypeScript
Affectons les valeurs aux différents attributs
[Link] = 1;
[Link] = "wick";
[Link] = "john";
Pour être sûr que les valeurs ont bien été affectées aux attributs,
on affiche
[Link](personne)
// affiche Personne { num: 1, nom: ’wick’, prenom: ’
john’ }
H & H: Research and Training 72 / 142
Classe Setter
TypeScript
Hypothèse
Supposant que l’on n’accepte pas de valeur négative pour l’attribut num de la
classe Personne
H & H: Research and Training 73 / 142
Classe Setter
TypeScript
Hypothèse
Supposant que l’on n’accepte pas de valeur négative pour l’attribut num de la
classe Personne
Démarche
1 Bloquer l’accès directe aux attributs (mettre la visibilité à private)
2 Définir des méthodes publiques qui contrôlent l’affectation de valeurs
aux attributs (les setter)
H & H: Research and Training 73 / 142
Classe Setter
TypeScript
Hypothèse
Supposant que l’on n’accepte pas de valeur négative pour l’attribut num de la
classe Personne
Démarche
1 Bloquer l’accès directe aux attributs (mettre la visibilité à private)
2 Définir des méthodes publiques qui contrôlent l’affectation de valeurs
aux attributs (les setter)
Convention
Mettre la visibilité private ou protected pour tous les attributs
Mettre la visibilité public pour toutes les méthodes
H & H: Research and Training 73 / 142
Classe Setter
Mettons la visibilité private pour tous les attributs de la classe Personne
export class Personne {
private num: number;
private nom: string;
private prenom: string;
}
H & H: Research and Training 74 / 142
Classe Setter
Mettons la visibilité private pour tous les attributs de la classe Personne
export class Personne {
private num: number;
private nom: string;
private prenom: string;
}
Dans le fichier [Link], les trois lignes suivantes sont soulignées en rouge
[Link] = 1;
[Link] = "wick";
[Link] = "john";
H & H: Research and Training 74 / 142
Classe Setter
Mettons la visibilité private pour tous les attributs de la classe Personne
export class Personne {
private num: number;
private nom: string;
private prenom: string;
}
Dans le fichier [Link], les trois lignes suivantes sont soulignées en rouge
[Link] = 1;
[Link] = "wick";
[Link] = "john";
Explication
Les attributs sont privés, donc aucun accès direct n’est autorisé
H & H: Research and Training 74 / 142
Classe Setter
Mettons la visibilité private pour tous les attributs de la classe Personne
export class Personne {
private num: number;
private nom: string;
private prenom: string;
}
Dans le fichier [Link], les trois lignes suivantes sont soulignées en rouge
[Link] = 1;
[Link] = "wick";
[Link] = "john";
Explication
Les attributs sont privés, donc aucun accès direct n’est autorisé
Solution : les setters
Des méthodes qui contrôlent l’affectation de valeurs aux attributs
H & H: Research and Training 74 / 142
Classe Setter
TypeScript
Conventions TypeScript
Le setter est une méthode déclarée avec le mot-clé set
Il porte le nom de l’attribut
On l’utilise comme un attribut
Pour éviter l’ambiguı̈té, on ajoute un underscore pour l’attribut
H & H: Research and Training 75 / 142
Classe Setter
TypeScript
Nouveau contenu de la classe Personne après ajout des setters
export class Personne {
private _num: number;
private _nom: string;
private _prenom: string;
public set num(_num : number) {
this._num = (_num >= 0 ? _num : 0);
}
public set nom(_nom: string) {
this._nom = _nom;
}
public set prenom(_prenom: string) {
this._prenom = _prenom;
}
}
H & H: Research and Training 76 / 142
Classe Setter
TypeScript
Pour tester, rien à changer dans [Link]
import { Personne } from ’./personne’;
let personne: Personne = new Personne();
[Link] = 1;
[Link] = "wick";
[Link] = "john";
[Link](personne);
H & H: Research and Training 77 / 142
Classe Setter
TypeScript
Pour tester, rien à changer dans [Link]
import { Personne } from ’./personne’;
let personne: Personne = new Personne();
[Link] = 1;
[Link] = "wick";
[Link] = "john";
[Link](personne);
Pour transpiler, ajouter l’option -t es5, le résultat est :
Personne { num: 1, nom: ’wick’, prenom: ’john’ }
H & H: Research and Training 77 / 142
Classe Setter
TypeScript
Testons avec une valeur négative pour l’attribut numero
import { Personne } from ’./personne’;
let personne: Personne = new Personne();
[Link] = -1;
[Link] = "wick";
[Link] = "john";
[Link](personne);
H & H: Research and Training 78 / 142
Classe Setter
TypeScript
Testons avec une valeur négative pour l’attribut numero
import { Personne } from ’./personne’;
let personne: Personne = new Personne();
[Link] = -1;
[Link] = "wick";
[Link] = "john";
[Link](personne);
Le résultat est :
Personne { num: 0, nom: ’wick’, prenom: ’john’ }
H & H: Research and Training 78 / 142
Classe Getter
TypeScript
Question
Comment récupérer les attributs (privés) de la classe Personne ?
H & H: Research and Training 79 / 142
Classe Getter
TypeScript
Question
Comment récupérer les attributs (privés) de la classe Personne ?
Démarche
Définir des méthodes qui retournent les valeurs des attributs (les getter)
H & H: Research and Training 79 / 142
Classe Getter
TypeScript
Question
Comment récupérer les attributs (privés) de la classe Personne ?
Démarche
Définir des méthodes qui retournent les valeurs des attributs (les getter)
Conventions TypeScript
Le getter est une méthode déclarée avec le mot-clé get
Il porte le nom de l’attribut
On l’utilise comme un attribut
H & H: Research and Training 79 / 142
Classe Getter
TypeScript
Ajoutons les getters dans la classe Personne
public get num() : number {
return this._num;
}
public get nom(): string {
return this._nom;
}
public get prenom(): string {
return this._prenom;
}
H & H: Research and Training 80 / 142
Classe Getter
TypeScript
Pour tester
import { Personne } from ’./personne’;
let personne: Personne = new Personne();
[Link] = 1;
[Link] = "wick";
[Link] = "john";
[Link]([Link]);
// affiche 1
[Link]([Link]);
// affiche wick
[Link]([Link]);
// affiche john
H & H: Research and Training 81 / 142
Classe Constructeur
TypeScript
Remarques
Par défaut, toute classe en TypeScript a un constructeur par
défaut sans paramètre
Pour simplifier la création d’objets, on peut définir un nouveau
constructeur qui prend en paramètre plusieurs attributs de la
classe
H & H: Research and Training 82 / 142
Classe Constructeur
TypeScript
Remarques
Par défaut, toute classe en TypeScript a un constructeur par
défaut sans paramètre
Pour simplifier la création d’objets, on peut définir un nouveau
constructeur qui prend en paramètre plusieurs attributs de la
classe
Les constructeurs avec TypeScript
On le déclare avec le mot-clé constructor
Il peut contenir la visibilité des attributs si on veut simplifier la
déclaration
H & H: Research and Training 82 / 142
Classe Constructeur
TypeScript
Le constructeur de la classe Personne prenant trois paramètres
public constructor(_num: number, _nom: string, _prenom:
string) {
this._num = _num;
this._nom = _nom;
this._prenom = _prenom;
}
H & H: Research and Training 83 / 142
Classe Constructeur
TypeScript
Le constructeur de la classe Personne prenant trois paramètres
public constructor(_num: number, _nom: string, _prenom:
string) {
this._num = _num;
this._nom = _nom;
this._prenom = _prenom;
}
Pour préserver la cohérence, il faut que le constructeur contrôle la
valeur de l’attribut num
public constructor(_num: number, _nom: string, _prenom:
string) {
this._num = (_num >= 0 ? _num : 0);
this._nom = _nom;
this._prenom = _prenom;
}
H & H: Research and Training 83 / 142
Classe Constructeur
TypeScript
On peut aussi appelé le setter dans le constructeur
public constructor(_num: number, _nom: string,
_prenom: string) {
[Link] = _num;
this._nom = _nom;
this._prenom = _prenom;
}
H & H: Research and Training 84 / 142
Classe Constructeur
TypeScript
Dans [Link], la ligne suivante est soulignée en rouge
let personne: Personne = new Personne();
H & H: Research and Training 85 / 142
Classe Constructeur
TypeScript
Dans [Link], la ligne suivante est soulignée en rouge
let personne: Personne = new Personne();
Explication
Le constructeur par défaut a été écrasé (il n’existe plus)
H & H: Research and Training 85 / 142
Classe Constructeur
TypeScript
Dans [Link], la ligne suivante est soulignée en rouge
let personne: Personne = new Personne();
Explication
Le constructeur par défaut a été écrasé (il n’existe plus)
Comment faire ?
TypeScript n’autorise pas la présence de plusieurs constructeurs
(la surcharge)
On peut utiliser soit les valeurs par défaut, soit les paramètres
optionnels
H & H: Research and Training 85 / 142
Classe Constructeur
TypeScript
Le nouveau constructeur avec les paramètres optionnels
public constructor(_num?: number, _nom?: string,
_prenom?: string) {
if(_num)
[Link] = _num;
if (_nom)
this._nom = _nom;
if(_prenom)
this._prenom = _prenom;
}
H & H: Research and Training 86 / 142
Classe Constructeur
TypeScript
Pour tester
import { Personne } from ’./personne’;
let personne: Personne = new Personne();
[Link] = -1;
[Link] = "wick";
[Link] = "john";
[Link](personne);
let personne2: Personne = new Personne(2, ’bob’, ’mike’);
[Link](personne2);
H & H: Research and Training 87 / 142
Classe Constructeur
TypeScript
Pour tester
import { Personne } from ’./personne’;
let personne: Personne = new Personne();
[Link] = -1;
[Link] = "wick";
[Link] = "john";
[Link](personne);
let personne2: Personne = new Personne(2, ’bob’, ’mike’);
[Link](personne2);
En exécutant, le résultat est :
Personne { num: 0, nom: ’wick’, prenom: ’john’ }
Personne { num: 2, nom: ’bob’, prenom: ’mike’ }
H & H: Research and Training 87 / 142
Classe Constructeur
TypeScript
TypeScript nous offre la possibilité de fusionner la déclaration des attributs et le
constructeur
public constructor(private _num?: number,
private _nom?: string,
private _prenom?: string) {
H & H: Research and Training 88 / 142
Classe Constructeur
TypeScript
TypeScript nous offre la possibilité de fusionner la déclaration des attributs et le
constructeur
public constructor(private _num?: number,
private _nom?: string,
private _prenom?: string) {
En exécutant, le résultat est le même
Personne { num: 0, nom: ’wick’, prenom: ’john’ }
Personne { num: 2, nom: ’bob’, prenom: ’mike’ }
H & H: Research and Training 88 / 142
Classe Attributs et méthodes statiques
TypeScript
Récapitulatif
Les instances d’une même classe ont toutes les mêmes attributs mais pas les mêmes
valeurs
H & H: Research and Training 89 / 142
Classe Attributs et méthodes statiques
TypeScript
Récapitulatif
Les instances d’une même classe ont toutes les mêmes attributs mais pas les mêmes
valeurs
Hypothèse
Et si nous voulions qu’un attribut ait une valeur partagée par toutes les instances (par
exemple, le nombre d’objets instanciés de la classe Personne)
H & H: Research and Training 89 / 142
Classe Attributs et méthodes statiques
TypeScript
Récapitulatif
Les instances d’une même classe ont toutes les mêmes attributs mais pas les mêmes
valeurs
Hypothèse
Et si nous voulions qu’un attribut ait une valeur partagée par toutes les instances (par
exemple, le nombre d’objets instanciés de la classe Personne)
Solution : attribut statique ou attribut de classe
Un attribut dont la valeur est partagée par toutes les instances de la classe.
H & H: Research and Training 89 / 142
Classe Attributs et méthodes statiques
TypeScript
Exemple
Si on voulait créer un attribut contenant le nombre d’objets créés à
partir de la classe Personne
Notre attribut doit être déclaré static, sinon chaque objet
pourrait avoir sa propre valeur pour cet attribut
H & H: Research and Training 90 / 142
Classe Attributs et méthodes statiques
TypeScript
Ajoutons un attribut statique nbrPersonnes à la liste d’attributs de la
classe Personne
private static _nbrPersonnes: number = 0;
H & H: Research and Training 91 / 142
Classe Attributs et méthodes statiques
TypeScript
Ajoutons un attribut statique nbrPersonnes à la liste d’attributs de la
classe Personne
private static _nbrPersonnes: number = 0;
Incrémentons notre compteur de personnes dans les constructeurs
public constructor(private _num?: number,
private _nom?: string,
private _prenom?: string) {
Personne._nbrPersonnes++;
}
H & H: Research and Training 91 / 142
Classe Attributs et méthodes statiques
TypeScript
Créons un getter pour l’attribut static nbrPersonnes
public static get nbrPersonnes() {
return Personne._nbrPersonnes;
}
H & H: Research and Training 92 / 142
Classe Attributs et méthodes statiques
TypeScript
Créons un getter pour l’attribut static nbrPersonnes
public static get nbrPersonnes() {
return Personne._nbrPersonnes;
}
Testons cela dans [Link]
import { Personne } from ’./personne’;
[Link]([Link]);
// affiche 0
let personne: Personne = new Personne();
[Link] = -1;
[Link] = "wick";
[Link] = "john";
[Link]([Link]);
// affiche 1
let personne2: Personne = new Personne(2, ’bob’, ’mike’);
[Link]([Link]);
// affiche 2
H & H: Research and Training 92 / 142
Classe Attributs et méthodes statiques
TypeScript
Exercice
Définir une classe Adresse avec trois attributs privés rue,
codePostal et ville de type chaı̂ne de caractère
Définir un constructeur avec trois paramètres, les getters et
setters
Dans la classe Personne, ajouter un attribut adresse (de type
Adresse) et définir un nouveau constructeur à quatre paramètres
et le getter et le setter de ce nouvel attribut
Dans [Link], créer deux objets : un objet adresse (de type
Adresse) et personne (de type Personne) prenant comme
adresse l’objet adresse
Afficher tous les attributs de l’objet personne
H & H: Research and Training 93 / 142
Héritage
TypeScript
L’héritage, quand ?
Lorsque deux ou plusieurs classes partagent plusieurs attributs
(et méthodes)
Lorsqu’une Classe1 est (une sorte de ) Classe2
H & H: Research and Training 94 / 142
Héritage
TypeScript
L’héritage, quand ?
Lorsque deux ou plusieurs classes partagent plusieurs attributs
(et méthodes)
Lorsqu’une Classe1 est (une sorte de ) Classe2
Forme générale
class ClasseFille extends ClasseMère
{
// code
};
H & H: Research and Training 94 / 142
Héritage
TypeScript
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
H & H: Research and Training 95 / 142
Héritage
TypeScript
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et un niveau
H & H: Research and Training 95 / 142
Héritage
TypeScript
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et un niveau
Sémantiquement, enseignant et étudiant sont une sorte de personne
H & H: Research and Training 95 / 142
Héritage
TypeScript
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et un niveau
Sémantiquement, enseignant et étudiant sont une sorte de personne
En plus, les deux partagent plusieurs attributs tels que numéro, nom et
prénom
H & H: Research and Training 95 / 142
Héritage
TypeScript
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et un niveau
Sémantiquement, enseignant et étudiant sont une sorte de personne
En plus, les deux partagent plusieurs attributs tels que numéro, nom et
prénom
Donc, on peut peut utiliser la classe Personne puisqu’elle contient tous
les attributs numéro, nom et prénom
H & H: Research and Training 95 / 142
Héritage
TypeScript
Exemple
Un enseignant a un numéro, un nom, un prénom et un salaire
Un étudiant a aussi un numéro, un nom, un prénom et un niveau
Sémantiquement, enseignant et étudiant sont une sorte de personne
En plus, les deux partagent plusieurs attributs tels que numéro, nom et
prénom
Donc, on peut peut utiliser la classe Personne puisqu’elle contient tous
les attributs numéro, nom et prénom
Les classes Étudiant et Enseignant hériteront donc (extends) de
la classe Personne
H & H: Research and Training 95 / 142
Héritage
TypeScript
Particularité du langage TypeScript
Une classe ne peut hériter que d’une seule classe
L’héritage multiple est donc non-autorisé.
H & H: Research and Training 96 / 142
Héritage
TypeScript
Préparons la classe Enseignant
import { Personne } from "./personne";
export class Enseignant extends Personne {
H & H: Research and Training 97 / 142
Héritage
TypeScript
Préparons la classe Enseignant
import { Personne } from "./personne";
export class Enseignant extends Personne {
Préparons la classe Etudiant
import { Personne } from "./personne";
export class Etudiant extends Personne {
}
extends est le mot-clé à utiliser pour définir une relation d’héritage
entre deux classes
H & H: Research and Training 97 / 142
Héritage
TypeScript
Ensuite
Créer un attribut niveau dans la classe Etudiant ainsi que ses
getter et setter
Créer un attribut salaire dans la classe Enseignant ainsi que
ses getter et setter
H & H: Research and Training 98 / 142
Héritage
TypeScript
Pour créer un objet de type Enseignant
import { Enseignant } from ’./enseignant’;
let enseignant: Enseignant = new Enseignant();
[Link] = 3;
[Link] = "green";
[Link] = "jonas";
[Link] = 1700;
[Link](enseignant);
H & H: Research and Training 99 / 142
Héritage
TypeScript
Pour créer un objet de type Enseignant
import { Enseignant } from ’./enseignant’;
let enseignant: Enseignant = new Enseignant();
[Link] = 3;
[Link] = "green";
[Link] = "jonas";
[Link] = 1700;
[Link](enseignant);
En exécutant, le résultat est :
Enseignant { _num: 3, _nom: ’green’, _prenom: ’jonas
’, _salaire: 1700 }
H & H: Research and Training 99 / 142
Héritage
TypeScript
TypeScript autorise la redéfinition : on peut définir un constructeur, même s’il
existe dans la classe mère, qui prend plusieurs paramètres et qui utilise le
constructeur de la classe mère
constructor(_num?: number,
_nom?: string,
_prenom?: string,
private _salaire?: number) {
super(_num, _nom, _prenom);
}
H & H: Research and Training 100 / 142
Héritage
TypeScript
TypeScript autorise la redéfinition : on peut définir un constructeur, même s’il
existe dans la classe mère, qui prend plusieurs paramètres et qui utilise le
constructeur de la classe mère
constructor(_num?: number,
_nom?: string,
_prenom?: string,
private _salaire?: number) {
super(_num, _nom, _prenom);
}
super() fait appel au constructeur de la classe mère
H & H: Research and Training 100 / 142
Héritage
TypeScript
TypeScript autorise la redéfinition : on peut définir un constructeur, même s’il
existe dans la classe mère, qui prend plusieurs paramètres et qui utilise le
constructeur de la classe mère
constructor(_num?: number,
_nom?: string,
_prenom?: string,
private _salaire?: number) {
super(_num, _nom, _prenom);
}
super() fait appel au constructeur de la classe mère
Maintenant, on peut créer un enseignant ainsi
let enseignant: Enseignant = new Enseignant(3, "green", "jonas"
, 1700);
H & H: Research and Training 100 / 142
Héritage
TypeScript
TypeScript autorise la redéfinition : on peut définir un constructeur, même s’il
existe dans la classe mère, qui prend plusieurs paramètres et qui utilise le
constructeur de la classe mère
constructor(_num?: number,
_nom?: string,
_prenom?: string,
private _salaire?: number) {
super(_num, _nom, _prenom);
}
super() fait appel au constructeur de la classe mère
Maintenant, on peut créer un enseignant ainsi
let enseignant: Enseignant = new Enseignant(3, "green", "jonas"
, 1700);
Refaire la même chose pour Etudiant
H & H: Research and Training 100 / 142
Héritage
TypeScript
À partir de la classe Enseignant
On ne peut avoir accès direct à un attribut de la classe mère
C’est-à-dire, on ne peut faire this. num car les attributs ont une
visibilité private
Pour modifier la valeur d’un attribut privé de la classe mère, il faut
soit utiliser les getters/setters
soit mettre la visibilité des attributs de la classe mère à protected
H & H: Research and Training 101 / 142
Héritage
TypeScript
On peut créer un objet de la classe Enseignant ainsi
let enseignant: Enseignant = new Enseignant(3, "
green", "jonas", 1700);
H & H: Research and Training 102 / 142
Héritage
TypeScript
On peut créer un objet de la classe Enseignant ainsi
let enseignant: Enseignant = new Enseignant(3, "
green", "jonas", 1700);
Ou ainsi
let enseignant: Personne = new Enseignant(3, "green"
, "jonas", 1700);
H & H: Research and Training 102 / 142
Héritage
TypeScript
On peut créer un objet de la classe Enseignant ainsi
let enseignant: Enseignant = new Enseignant(3, "
green", "jonas", 1700);
Ou ainsi
let enseignant: Personne = new Enseignant(3, "green"
, "jonas", 1700);
Ceci est faux
let enseignant: Enseignant = new Personne(3, "green"
, "jonas");
H & H: Research and Training 102 / 142
Héritage
TypeScript
Remarque
Pour connaı̂tre la classe d’un objet, on peut utiliser le mot-clé instanceof
H & H: Research and Training 103 / 142
Héritage
TypeScript
Remarque
Pour connaı̂tre la classe d’un objet, on peut utiliser le mot-clé instanceof
Exemple
let enseignant: Personne = new Enseignant(3, "green", "jonas",
1700);
[Link](enseignant instanceof Enseignant);
// affiche true
[Link](enseignant instanceof Personne);
// affiche true
[Link](personne instanceof Enseignant);
// affiche false
H & H: Research and Training 103 / 142
Héritage
TypeScript
Exercice
1 Créer un objet de type Etudiant, un deuxième de type Enseignant et un
dernier de type Personne stocker les tous dans un seul tableau.
2 Parcourir le tableau et afficher pour chacun soit le numero s’il est personne, soit
le salaire s’il est enseignant ou soit le niveau s’il est étudiant.
H & H: Research and Training 104 / 142
Héritage
TypeScript
Exercice
1 Créer un objet de type Etudiant, un deuxième de type Enseignant et un
dernier de type Personne stocker les tous dans un seul tableau.
2 Parcourir le tableau et afficher pour chacun soit le numero s’il est personne, soit
le salaire s’il est enseignant ou soit le niveau s’il est étudiant.
Pour parcourir un tableau, on peut faire
let personnes: Array<Personne> = [personne, enseignant,
etudiant];
for(let p of personnes) {
H & H: Research and Training 104 / 142
Héritage
TypeScript
Solution
let personnes: Array<Personne> = [personne,
enseignant, etudiant];
for(let p of personnes) {
if(p instanceof Enseignant)
[Link]([Link]);
else if (p instanceof Etudiant)
[Link]([Link])
else
[Link]([Link]);
}
H & H: Research and Training 105 / 142
Classe et méthode abstraites
TypeScript
Classe abstraite
C’est une classe qu’on ne peut instancier
On la déclare avec le mot-clé abstract
H & H: Research and Training 106 / 142
Classe et méthode abstraites
TypeScript
Classe abstraite
C’est une classe qu’on ne peut instancier
On la déclare avec le mot-clé abstract
Si on déclare la classe Personne abstraite
export abstract class Personne {
...
}
H & H: Research and Training 106 / 142
Classe et méthode abstraites
TypeScript
Classe abstraite
C’est une classe qu’on ne peut instancier
On la déclare avec le mot-clé abstract
Si on déclare la classe Personne abstraite
export abstract class Personne {
...
}
Tout ce code sera souligné en rouge
let personne: Personne = new Personne();
...
let personne2: Personne = new Personne(2, ’bob’, ’mike’);
H & H: Research and Training 106 / 142
Classe et méthode abstraites
TypeScript
Méthode abstraite
C’est une méthode non implémentée (sans code)
Une méthode abstraite doit être déclarée dans une classe abstraite
Une méthode abstraite doit être implémentée par les classes filles de la classe abstraite
H & H: Research and Training 107 / 142
Classe et méthode abstraites
TypeScript
Méthode abstraite
C’est une méthode non implémentée (sans code)
Une méthode abstraite doit être déclarée dans une classe abstraite
Une méthode abstraite doit être implémentée par les classes filles de la classe abstraite
Déclarons une méthode abstraite afficherDetails() dans Personne
abstract afficherDetails(): void ;
H & H: Research and Training 107 / 142
Classe et méthode abstraites
TypeScript
Méthode abstraite
C’est une méthode non implémentée (sans code)
Une méthode abstraite doit être déclarée dans une classe abstraite
Une méthode abstraite doit être implémentée par les classes filles de la classe abstraite
Déclarons une méthode abstraite afficherDetails() dans Personne
abstract afficherDetails(): void ;
Remarque
La méthode afficherDetails() dans Personne est soulignée en rouge car la classe
doit être déclarée abstraite
En déclarant la classe Personne abstraite, les deux classes Etudiant et Enseignant
sont soulignées en rouge car elles doivent implémenter les méthodes abstraites de
Personne
H & H: Research and Training 107 / 142
Classe et méthode abstraites
Pour implémenter la méthode abstraite
Placer le curseur sur le nom de la classe
Dans le menu afficher, cliquer sur Quick Fix puis Add inherited abstract class
H & H: Research and Training 108 / 142
Classe et méthode abstraites
Pour implémenter la méthode abstraite
Placer le curseur sur le nom de la classe
Dans le menu afficher, cliquer sur Quick Fix puis Add inherited abstract class
Le code généré
afficherDetails(): void {
throw new Error("Method not implemented.");
}
H & H: Research and Training 108 / 142
Classe et méthode abstraites
Pour implémenter la méthode abstraite
Placer le curseur sur le nom de la classe
Dans le menu afficher, cliquer sur Quick Fix puis Add inherited abstract class
Le code généré
afficherDetails(): void {
throw new Error("Method not implemented.");
}
Remplaçons le code généré dans Etudiant par
afficherDetails(): void {
[Link]([Link] + " " + [Link] + " " + [Link]);
}
H & H: Research and Training 108 / 142
Classe et méthode abstraites
Pour implémenter la méthode abstraite
Placer le curseur sur le nom de la classe
Dans le menu afficher, cliquer sur Quick Fix puis Add inherited abstract class
Le code généré
afficherDetails(): void {
throw new Error("Method not implemented.");
}
Remplaçons le code généré dans Etudiant par
afficherDetails(): void {
[Link]([Link] + " " + [Link] + " " + [Link]);
}
Et dans Enseignant par
afficherDetails(): void {
[Link]([Link] + " " + [Link] + " " + [Link]);
}
H & H: Research and Training 108 / 142
Classe et méthode abstraites
TypeScript
Pour tester
let enseignant: Enseignant = new Enseignant(3, "
green", "jonas", 1700);
[Link]();
H & H: Research and Training 109 / 142
Classe et méthode abstraites
TypeScript
Pour tester
let enseignant: Enseignant = new Enseignant(3, "
green", "jonas", 1700);
[Link]();
En exécutant, le résultat est :
green jonas 1700
H & H: Research and Training 109 / 142
Interface
TypeScript
En TypeScript
Une classe ne peut hériter que d’une seule classe
Mais elle peut hériter de plusieurs interfaces
H & H: Research and Training 110 / 142
Interface
TypeScript
En TypeScript
Une classe ne peut hériter que d’une seule classe
Mais elle peut hériter de plusieurs interfaces
Une interface
déclarée avec le mot-clé interface
comme une classe complètement abstraite (impossible de
l’instancier) dont : toutes les méthodes sont abstraites
un protocole, un contrat : toute classe qui hérite d’une interface
doit implémenter toutes ses méthodes
H & H: Research and Training 110 / 142
Interface
TypeScript
Définissons l’interface IMiseEnForme dans [Link]
export interface IMiseEnForme {
afficherNomMajuscule(): void;
afficherPrenomMajuscule() : void;
}
H & H: Research and Training 111 / 142
Interface
TypeScript
Définissons l’interface IMiseEnForme dans [Link]
export interface IMiseEnForme {
afficherNomMajuscule(): void;
afficherPrenomMajuscule() : void;
}
Pour hériter d’une interface, on utilise le mot-clé implements
export abstract class Personne implements IMiseEnForme {
...
}
H & H: Research and Training 111 / 142
Interface
TypeScript
La classe Personne est soulignée en rouge
Placer le curseur sur la classe Personne
Dans le menu afficher, cliquer sur Quick Fix puis Add
inherited abstract class
H & H: Research and Training 112 / 142
Interface
TypeScript
La classe Personne est soulignée en rouge
Placer le curseur sur la classe Personne
Dans le menu afficher, cliquer sur Quick Fix puis Add
inherited abstract class
Le code généré
afficherNomMajuscule(): void {
throw new Error("Method not implemented.");
}
afficherPrenomMajuscule(): void {
throw new Error("Method not implemented.");
}
H & H: Research and Training 112 / 142
Interface
TypeScript
Modifions le code de deux méthodes générées
afficherNomMajuscule(): void {
[Link]([Link]());
}
afficherPrenomMajuscule(): void {
[Link]([Link]());
}
H & H: Research and Training 113 / 142
Interface
TypeScript
Pour tester
let enseignant: Enseignant = new Enseignant(3, "
green", "jonas", 1700);
[Link]();
[Link]();
H & H: Research and Training 114 / 142
Interface
TypeScript
Pour tester
let enseignant: Enseignant = new Enseignant(3, "
green", "jonas", 1700);
[Link]();
[Link]();
En exécutant, le résultat est :
GREEN
JONAS
H & H: Research and Training 114 / 142
Interface
TypeScript
Remarque
Une interface peut hériter de plusieurs autres interfaces (mais pas
d’une classe)
Pour cela, il faut utiliser le mot-clé extends et pas implements
car une interface n’implémente jamais de méthodes.
H & H: Research and Training 115 / 142
Interface
TypeScript
Une deuxième utilisation
En TypeScript, une interface peut être utilisée comme une classe
Model de plusieurs autres interfaces (mais pas d’une classe)
Elle contient des attributs (qui sont par définition publiques) et des
méthodes (abstraites)
H & H: Research and Training 116 / 142
Interface
TypeScript
Une deuxième utilisation
En TypeScript, une interface peut être utilisée comme une classe
Model de plusieurs autres interfaces (mais pas d’une classe)
Elle contient des attributs (qui sont par définition publiques) et des
méthodes (abstraites)
Exemple
export interface Person {
num: number;
nom: string;
prenom: string;
}
H & H: Research and Training 116 / 142
Interface
TypeScript
Impossible d’instancier cette interface avec l’opérateur new, mais on
peut utiliser les objets JavaScript
let person: Person = {
num: 1000,
nom: ’turing’,
prenom: ’alan’
};
[Link](person);
// affiche { num: 1000, nom: ’turing’, prenom: ’alan’ }
H & H: Research and Training 117 / 142
Interface
TypeScript
Impossible d’instancier cette interface avec l’opérateur new, mais on
peut utiliser les objets JavaScript
let person: Person = {
num: 1000,
nom: ’turing’,
prenom: ’alan’
};
[Link](person);
// affiche { num: 1000, nom: ’turing’, prenom: ’alan’ }
On peut rendre les attributs optionnels
export interface Person {
num?: number;
nom?: string;
prenom?: string;
}
H & H: Research and Training 117 / 142
Interface
TypeScript
Ainsi on peut faire
let person: Person = {
nom: ’turing’,
};
[Link](person)
// affiche { nom: ’turing’ }
H & H: Research and Training 118 / 142
Interface
TypeScript
Ainsi on peut faire
let person: Person = {
nom: ’turing’,
};
[Link](person)
// affiche { nom: ’turing’ }
Pour la suite, gardons l’attribut nom obligatoire
export interface Person {
num?: number;
nom: string;
prenom?: string;
}
H & H: Research and Training 118 / 142
Interface
TypeScript
Duck typing
Un concept un peu proche du polymorphisme
Il se base sur une série d’attributs et de méthodes attendus.
L’objet est considéré valide quel que soit sa classe s’il respecte les
attributs et les méthodes attendus.
H & H: Research and Training 119 / 142
Interface
TypeScript
Duck typing
Un concept un peu proche du polymorphisme
Il se base sur une série d’attributs et de méthodes attendus.
L’objet est considéré valide quel que soit sa classe s’il respecte les
attributs et les méthodes attendus.
Exemple : considérons la fonction afficherNom() définie dans
[Link]
function afficherNom(p: Person){
[Link]([Link])
}
H & H: Research and Training 119 / 142
Interface
TypeScript
Si l’objet passé en paramètre contient un attribut nom, alors ce dernier sera affiché
afficherNom(person);
// affiche turing
afficherNom(personne);
// affiche wick
H & H: Research and Training 120 / 142
Interface
TypeScript
Si l’objet passé en paramètre contient un attribut nom, alors ce dernier sera affiché
afficherNom(person);
// affiche turing
afficherNom(personne);
// affiche wick
Ceci est aussi correcte car alien a un attribut nom
let alien = { couleur: ’blanc’, nom: ’white’ };
afficherNom(alien);
// affiche white
H & H: Research and Training 120 / 142
Interface
TypeScript
Si l’objet passé en paramètre contient un attribut nom, alors ce dernier sera affiché
afficherNom(person);
// affiche turing
afficherNom(personne);
// affiche wick
Ceci est aussi correcte car alien a un attribut nom
let alien = { couleur: ’blanc’, nom: ’white’ };
afficherNom(alien);
// affiche white
Ceci génère une erreur car voiture n’a pas d’attribut nom
let voiture = { marque: ’ford’, modele: ’fiesta’, num: 100000};
afficherNom(voiture);
H & H: Research and Training 120 / 142
Décorateur
TypeScript
Décorateur
L’équivalent d’annotations en Java et php
Méta-programmation (modification des informations/comportement sur
un objet/classe)
Utilisé avec le préfixe @
H & H: Research and Training 121 / 142
Décorateur
TypeScript
Décorateur
L’équivalent d’annotations en Java et php
Méta-programmation (modification des informations/comportement sur
un objet/classe)
Utilisé avec le préfixe @
Ajoutons le décorateur @f() à afficherDetails() dans Enseignant
@f()
afficherDetails(): void {
[Link]([Link] + " " + [Link] + " " + this.
salaire);
}
H & H: Research and Training 121 / 142
Décorateur
TypeScript
Le décorateur @f() n’existe pas en TypeScript, il faut donc le définir (en lui associant une
fonction)
export function f() {
return function(a,b,c){
[Link](’before afficherDetails()’);
}
}
H & H: Research and Training 122 / 142
Décorateur
TypeScript
Le décorateur @f() n’existe pas en TypeScript, il faut donc le définir (en lui associant une
fonction)
export function f() {
return function(a,b,c){
[Link](’before afficherDetails()’);
}
}
Testons maintenant le code suivant et vérifions que la fonction associée au décorateur a
bien été exécutée (ajouter l’option --experimentalDecorators à la commande de
transpilation)
let enseignant: Enseignant = new Enseignant(3, "green", "jonas", 1700);
[Link]();
H & H: Research and Training 122 / 142
Décorateur
TypeScript
Le décorateur @f() n’existe pas en TypeScript, il faut donc le définir (en lui associant une
fonction)
export function f() {
return function(a,b,c){
[Link](’before afficherDetails()’);
}
}
Testons maintenant le code suivant et vérifions que la fonction associée au décorateur a
bien été exécutée (ajouter l’option --experimentalDecorators à la commande de
transpilation)
let enseignant: Enseignant = new Enseignant(3, "green", "jonas", 1700);
[Link]();
Le résultat est :
before afficherDetails()
green jonas 1700
H & H: Research and Training 122 / 142
Généricité
TypeScript
Généricité
Un concept défini dans tous les LOO avec < ... >
Elle permet de définir des fonctions, classes, interfaces qui
s’adaptent avec plusieurs types
H & H: Research and Training 123 / 142
Généricité
TypeScript
Exemple
si on a besoin d’une classe dont les méthodes effectuent les
mêmes opérations quel que soit le type d’attributs
somme pour entiers ou réels,
concaténation pour chaı̂nes de caractères,
ou logique pour booléens...
...
Impossible sans définir plusieurs classes (une pour chaque
type)
H & H: Research and Training 124 / 142
Généricité
TypeScript
Solution avec la généricité
export class Operation<T>{
constructor(private var1: T, private var2: T) { }
public plus() {
if (typeof this.var1 == ’string’) {
return this.var1 + this.var2;
}
else if (typeof this.var1 == ’number’ && typeof this.var2 == ’
number’) {
return this.var1 + this.var2;
}
else if (typeof this.var1 == ’boolean’ && typeof this.var2 == ’
boolean’) {
return this.var1 || this.var2;
}
else {
throw "error"
}
}
}
H & H: Research and Training 125 / 142
Généricité
TypeScript
Nous pouvons donc utiliser la même méthode qui fait la même chose pour des types
différents
let operation1: Operation<number> = new Operation(5, 3);
[Link]([Link]());
// affiche 8
let operation2: Operation<string> = new Operation("bon", "jour");
[Link]([Link]());
// affiche bonjour
let operation3: Operation<number> = new Operation(5.2, 3.8);
[Link]([Link]());
// affiche 9
let operation4: Operation<boolean> = new Operation(true, false);
[Link]([Link]());
// affiche true
H & H: Research and Training 126 / 142
Map
TypeScript
Map (dictionnaire)
Type fonctionnant avec un couple (clé,valeur)
La clé doit être unique
Chaque élément est appelé entrée (entry)
Les éléments sont stockés et récupérés dans l’ordre d’insertion
Disponible depuis ES5 puis modifié dans ES6
H & H: Research and Training 127 / 142
Map
TypeScript
Map (dictionnaire)
Type fonctionnant avec un couple (clé,valeur)
La clé doit être unique
Chaque élément est appelé entrée (entry)
Les éléments sont stockés et récupérés dans l’ordre d’insertion
Disponible depuis ES5 puis modifié dans ES6
Pour tester, utiliser l’option -t ES6
H & H: Research and Training 127 / 142
Map
TypeScript
Pour créer un Map
let map: Map<string, number> = new Map([
[’php’, 17],
[’java’, 10],
[’c’, 12]
]);
[Link](map);
// affiche Map { ’php’ => 17, ’java’ => 10, ’c’ => 12 }
H & H: Research and Training 128 / 142
Map
TypeScript
Pour créer un Map
let map: Map<string, number> = new Map([
[’php’, 17],
[’java’, 10],
[’c’, 12]
]);
[Link](map);
// affiche Map { ’php’ => 17, ’java’ => 10, ’c’ => 12 }
Ajouter un élément à un Map
[Link](’html’, 18);
H & H: Research and Training 128 / 142
Map
TypeScript
Pour créer un Map
let map: Map<string, number> = new Map([
[’php’, 17],
[’java’, 10],
[’c’, 12]
]);
[Link](map);
// affiche Map { ’php’ => 17, ’java’ => 10, ’c’ => 12 }
Ajouter un élément à un Map
[Link](’html’, 18);
Pour ajouter plusieurs éléments à la fois
[Link](’html’, 18)
.set(’css’, 12);
H & H: Research and Training 128 / 142
Map
TypeScript
Si la clé existe déjà, la valeur sera remplacée
[Link]([Link](’html’, 20));
// affiche Map { ’php’ => 17, ’java’ => 10, ’c’ => 12, ’html’ => 20 }
H & H: Research and Training 129 / 142
Map
TypeScript
Si la clé existe déjà, la valeur sera remplacée
[Link]([Link](’html’, 20));
// affiche Map { ’php’ => 17, ’java’ => 10, ’c’ => 12, ’html’ => 20 }
Pour récupérer la valeur associée à une clé
[Link]([Link](’php’));
// affiche 17
H & H: Research and Training 129 / 142
Map
TypeScript
Si la clé existe déjà, la valeur sera remplacée
[Link]([Link](’html’, 20));
// affiche Map { ’php’ => 17, ’java’ => 10, ’c’ => 12, ’html’ => 20 }
Pour récupérer la valeur associée à une clé
[Link]([Link](’php’));
// affiche 17
Pour vérifier l’existence d’une clé
[Link]([Link](’php’));
// affiche true
H & H: Research and Training 129 / 142
Map
TypeScript
Si la clé existe déjà, la valeur sera remplacée
[Link]([Link](’html’, 20));
// affiche Map { ’php’ => 17, ’java’ => 10, ’c’ => 12, ’html’ => 20 }
Pour récupérer la valeur associée à une clé
[Link]([Link](’php’));
// affiche 17
Pour vérifier l’existence d’une clé
[Link]([Link](’php’));
// affiche true
Pour supprimer un élément selon la clé
[Link](’php’);
H & H: Research and Training 129 / 142
Map
TypeScript
Pour récupérer la liste des clés d’un Map
[Link]([Link]());
// affiche [Map Iterator] { ’java’, ’c’, ’html’, ’css’ }
H & H: Research and Training 130 / 142
Map
TypeScript
Pour récupérer la liste des clés d’un Map
[Link]([Link]());
// affiche [Map Iterator] { ’java’, ’c’, ’html’, ’css’ }
Pour récupérer la liste des valeurs d’un Map
[Link]([Link]());
// affiche [Map Iterator] { 10, 12, 20, 12 }
H & H: Research and Training 130 / 142
Map
TypeScript
Pour récupérer la liste des clés d’un Map
[Link]([Link]());
// affiche [Map Iterator] { ’java’, ’c’, ’html’, ’css’ }
Pour récupérer la liste des valeurs d’un Map
[Link]([Link]());
// affiche [Map Iterator] { 10, 12, 20, 12 }
Pour récupérer la liste des entrées d’un Map
[Link]([Link]());
/* affiche
[Map Entries] {
[ ’java’, 10 ],
[ ’c’, 12 ],
[ ’html’, 20 ],
[ ’css’, 12 ]
}
*/
H & H: Research and Training 130 / 142
Map
TypeScript
Pour parcourir un Map, on peut utiliser entries() (solution ES5)
for (let elt of [Link]())
[Link](elt[0] + " " + elt[1]);
/* affiche
java 10
c 12
html 20
css 12
*/
H & H: Research and Training 131 / 142
Map
TypeScript
Pour parcourir un Map, on peut utiliser entries() (solution ES5)
for (let elt of [Link]())
[Link](elt[0] + " " + elt[1]);
/* affiche
java 10
c 12
html 20
css 12
*/
Depuis ES6, on peut faire
for (let [key, value] of map) {
[Link](key, value);
}
/* affiche
java 10
c 12
html 20
css 12
*/
H & H: Research and Training 131 / 142
Map
TypeScript
On peut le faire aussi avec keys()
for (let key of [Link]()) {
[Link](key + " " + [Link](key));
}
/* affiche
java 10
c 12
html 20
css 12
*/
H & H: Research and Training 132 / 142
Map
TypeScript
Une deuxième solution consiste à utiliser forEach (affiche
seulement les valeurs)
[Link](elt => [Link](elt));
/* affiche
10
12
20
12
*/
H & H: Research and Training 133 / 142
Map
TypeScript
On peut aussi définir une méthode et l’appeler dans forEach (affiche
seulement les valeurs)
[Link](elt => afficher(elt));
function afficher(elt) {
[Link](elt)
}
H & H: Research and Training 134 / 142
Map
TypeScript
On peut aussi définir une méthode et l’appeler dans forEach (affiche
seulement les valeurs)
[Link](elt => afficher(elt));
function afficher(elt) {
[Link](elt)
}
On peut encore simplifier l’appel de la fonction avec les callback
(affiche seulement les valeurs)
[Link](afficher);
function afficher(elt){
[Link](elt)
}
H & H: Research and Training 134 / 142
Map
TypeScript
Pour afficher les clés et les valeurs
[Link](afficher);
function afficher(value, key) {
[Link](value, key)
}
/* affiche
10 java
12 c
20 html
12 css
*/
H & H: Research and Training 135 / 142
Set
TypeScript
Set
Une collection ne contenant pas de doublons
Acceptant les types simples et objets
Les éléments sont stockées et récupérés dans l’ordre d’insertion
Disponible depuis ES5 puis modifié dans ES6
H & H: Research and Training 136 / 142
Set
TypeScript
Set
Une collection ne contenant pas de doublons
Acceptant les types simples et objets
Les éléments sont stockées et récupérés dans l’ordre d’insertion
Disponible depuis ES5 puis modifié dans ES6
Pour tester, utiliser l’option -t ES6
H & H: Research and Training 136 / 142
Set
TypeScript
Pour créer un Set
let marques = new Set(["peugeot", "ford", "fiat", "mercedes"]);
[Link](marques);
// affiche Set { ’peugeot’, ’ford’, ’fiat’, ’mercedes’ }
H & H: Research and Training 137 / 142
Set
TypeScript
Pour créer un Set
let marques = new Set(["peugeot", "ford", "fiat", "mercedes"]);
[Link](marques);
// affiche Set { ’peugeot’, ’ford’, ’fiat’, ’mercedes’ }
Ajouter un élément à un Set
[Link](’citroen’);
H & H: Research and Training 137 / 142
Set
TypeScript
Pour créer un Set
let marques = new Set(["peugeot", "ford", "fiat", "mercedes"]);
[Link](marques);
// affiche Set { ’peugeot’, ’ford’, ’fiat’, ’mercedes’ }
Ajouter un élément à un Set
[Link](’citroen’);
Pour ajouter plusieurs éléments à la fois
[Link](’citroen’)
.add(’renault’);
H & H: Research and Training 137 / 142
Set
TypeScript
On ne peut ajouter un élément deux fois
[Link](’peugeot’);
[Link](marques);
// affiche Set { ’peugeot’, ’ford’, ’fiat’, ’mercedes’, ’
citroen’, ’renault’ }
H & H: Research and Training 138 / 142
Set
TypeScript
On ne peut ajouter un élément deux fois
[Link](’peugeot’);
[Link](marques);
// affiche Set { ’peugeot’, ’ford’, ’fiat’, ’mercedes’, ’
citroen’, ’renault’ }
Pour vérifier l’existence d’un élément
[Link]([Link](’fiat’));
// affiche true
H & H: Research and Training 138 / 142
Set
TypeScript
On ne peut ajouter un élément deux fois
[Link](’peugeot’);
[Link](marques);
// affiche Set { ’peugeot’, ’ford’, ’fiat’, ’mercedes’, ’
citroen’, ’renault’ }
Pour vérifier l’existence d’un élément
[Link]([Link](’fiat’));
// affiche true
Pour supprimer un élément
[Link](’ford’);
[Link](marques);
// affiche Set { ’peugeot’, ’fiat’, ’mercedes’, ’citroen’, ’
renault’ }
H & H: Research and Training 138 / 142
Set
TypeScript
Autres méthodes sur les Set
[Link](B) : retourne true si A est un sous-ensemble de B,
false sinon.
[Link](B) : retourne un Set regroupant les éléments de A et
de B.
[Link](B) : retourne un Set contenant les éléments
de A qui sont dans B.
[Link](B) : retourne un Set contenant les éléments de
A qui ne sont pas dans B.
H & H: Research and Training 139 / 142
Set
TypeScript
Pour parcourir un Set
for(let marque of marques) {
[Link](marque)
}
/* affiche
peugeot
fiat
mercedes
citroen
renault
*/
H & H: Research and Training 140 / 142
Set
TypeScript
Une deuxième solution consiste à utiliser forEach
[Link](elt => [Link](elt));
/* affiche
peugeot
fiat
mercedes
citroen
renault
*/
H & H: Research and Training 141 / 142
Set
TypeScript
On peut aussi définir une méthode et l’appeler dans forEach
[Link](elt => afficher(elt));
function afficher(elt){
[Link](elt)
}
H & H: Research and Training 142 / 142
Set
TypeScript
On peut aussi définir une méthode et l’appeler dans forEach
[Link](elt => afficher(elt));
function afficher(elt){
[Link](elt)
}
On peut encore simplifier l’appel de la fonction avec les callback
[Link](afficher);
function afficher(elt){
[Link](elt)
}
H & H: Research and Training 142 / 142