TypeScript Pour Angular
TypeScript Pour Angular
1
Plan
1. Introduction
2. Variable
3. Constante
4. Fonction
5. Concept de décomposition (spread)
6. Import / Export
2
7. Classe
8. Héritage
9. Classe et méthode abstraites
Introduction
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
3 ❖ ECMAScript version 5 (ES5) ou ES 2009
❖ ECMAScript version 6 (ES6) ou ES 2015)
❖ ECMAScript version 7 (ES7) ou ES2016
Introduction
TypeScript
❖ langage de programmation
▪procédural et orienté objet
▪supportant le typage statique, dynamique et générique
❖ open-source
4
❖ créé par Anders Hejlsberg (inventeur de C#) de MicroSoft
❖ utilisé par Angular (Google)
Introduction
TypeScript : sur-couche de ES6 ajoutant
❖ typage
❖ meilleure gestion de module (à ne pas confondre avec les modules
Angular)
5
Le navigateur ne comprend pas le TypeScript
Il faut le transcompiler (ou transpiler) en JavaScript
on a besoin ?
❖ Node.js pour exécuter la commande node
❖ TypeScript pour exécuter la commande tsc
Installation de TypeScript
9
x = "bonjour"; // génère une erreur car une variable ne change
pas de type
Pour les chaînes de caractères, on peut faire
var str1: string = "TypeScript";
var str2: string = ’ pour Angular’;
On peut aussi utiliser template strings
var str3: string = ‘Cours ${ str2 } ${ str1 }
Que pensez-vous de Type Script ? ‘;
console.log(str3);
// affiche Cours TypeScript pour Angular
10Que pensez-vous de TypeScript ?
L’ équivalent de faire
var str3: string = "Bonjour " + str2 + " " + str1 + "\n Que
pensez-vous de TypeScript ?";
Une première déclaration pour les tableaux
var list: number[] = [1, 2, 3];
console.log(list);
// affiche [ 1, 2, 3 ]
Une deuxième déclaration
var list: Array<number> = new Array(1, 2, 3);
console.log(list);
// affiche [ 1, 2, 3 ]
11Ou encore plus simple
var list: Array<number> = [1, 2, 3];
console.log(list);
// affiche [ 1, 2, 3 ]
H
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[] = Array.from(Array(3).keys())
console.log(list); // affiche [ 0, 1, 2 ]
On peut utiliser une fonction fléchée (à voir dans une prochaine section)
12
pour modifier les valeurs générées
var list: number[] = Array.from({ length: 3 }, (v, k) => k + 1)
console.log(list); // affiche [ 1, 2, 3 ]
H
Tuples
Les tuples permettent de stocker plusieurs champs de types différents.
var tup = []; // Tuple vide
var mytuple = [10,"Hello","World","typeScript"];
mytuple.length // retourne nb de champs du tuple
mytuple.push(12) // ajoute un élément au tuple
mytuple.pop() // supprime et retourne la dernière valeur du tuple
13
any
Exemple
var x: any;
x = "bonjour";
x = 5;
console.log(x); // affiche 5;
Une variable de type any peut être affectée à n’importe quel autre
type de variable
14var x: any;
x = "bonjour";
x = 5;
var y: number = x;
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;
console.log(x);
// affiche 5;
Ceci génére donc une erreur
15var x: unknown;
x = "bonjour";
x = 5;
var y: number = x; H
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;
16
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;
}
17
console.log(x); // affiche ReferenceError: x is not defined
Conversion
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);
console.log(a); // affiche 2
console.log(b); // affiche 3.5
18
Alias de type
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’ ];
console.log(first); // affiche [ 100, ’wick’, ’john’ ]
19
Constante
se d´déclare avec le mot-clé const
const X: any = 5;
X = "bonjour";
20
Fonctions
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;
21
}
Une fonction qui ne retourne rien a le type void
function direBonjour(): void {
console.log("bonjour");
Fonctions
Cette syntaxe permet d'initialiser des paramètres lors de l'appel de la fonction si
aucune valeur n'est passée ou si c'est la valeur undefined qui est passée.
function division(x: number, y: number = 1) : number
{
return x / y;
}
console.log(division(10)); // affiche 10
22console.log(division(10, 2)); // affiche 5
}
Fonctions
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;
}
23
console.log(division(10)); // affiche 10
console.log(division(10, 2)); // affiche 5
Fonctions
Paramètres du reste (Rest parameters)
Cette syntaxe permet de représenter un nombre indéfini d'arguments sous forme
d'un tableau.
function somme(x: number, ...tab: number[]): number {
for (let elt of tab)
x += elt;
return x;
24}
console.log(somme(10)); // affiche 10
console.log(somme(10, 5)); // affiche 15
console.log(somme(10, 1, 6)); // affiche 17
H
Fonctions
Paramètres à plusieurs types autorisés
Il est possible d’autoriser plusieurs types pour un param`etre
function stringOrNumber(param1: string | number,
param2: number): number {
if (typeof param1 == "string")
return param1.length + param2;
return param1 + param2;
25
}
console.log(stringOrNumber("bonjour", 3)); // affiche 10
console.log(stringOrNumber(5, 3)); // affiche 8
Fonctions
Paramètres Fonctions 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
26
let somme = (a: number, b: number): number => a + b;
Appeler une fonction fléchée
let resultat: number = somme (1, 3);
H
Fonctions
Paramètres Fonctions fléchées
Cas d’une fonction fléchée à un seul paramètre
let carre = (a: number): number => a * a;
console.log(carre(2)); // affiche 4
Sans typage, la fonction peut être écrite ainsi
let carre = a => a * a;
console.log(carre(2)); // affiche 4
27
Déclaration d’une fonction fléchée sans paramètre
let sayHello = (): void => console.log(’Hello’);
sayHello(); // affiche Hello
Fonctions
Paramètres Fonctions fléchées
Cas d’une fonction fléchée à un seul paramètre
let carre = (a: number): number => a * a;
console.log(carre(2)); // affiche 4
Sans typage, la fonction peut être écrite ainsi
let carre = a => a * a;
console.log(carre(2)); // affiche 4
28
Déclaration d’une fonction fléchée sans paramètre
let sayHello = (): void => console.log(’Hello’);
sayHello(); // affiche Hello
Fonctions
Paramètres Fonctions fléchées
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
let obj = { nom: ’ ISET’, afficherNom: () => {
console.log(this.nom) } }
obj.afficherNom(); // affiche undefined
29
Sans les fonctions fléchées
let obj = { nom: ’ISET’, afficherNom: function() {
console.log(this.nom) } }
obj.afficherNom(); // affiche ISET
Fonctions
Concept de décomposition (spread)
let t: Array<number> = [1, 3, 5];
console.log(somme(...t));
On peut utiliser partiellement la décomposition
37
Classes
Qu’est ce qu’une classe en POO?
❖ 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
38
❖ 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
Classes
De quoi est composé une classe?
Nom Classe
les attributs
les méthodes
43
Classes
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); }
44
public set nom(_nom: string) {
this._nom = _nom; }
public set prenom(_prenom: string) {
this._prenom = _prenom; } }
Classes
Pour tester, rien à changer dans file.ts
Pour transpiler, ajouter l’option -t es5,
le résultat est :
Personne {_num: 1, _nom: ’ tounsi’, _prenom: ’ mohamed’ }
le résultat est :
Personne {_num: 0, _nom: ’ tounsi’, _prenom: ’ mohamed’ }
Classes
Question
Comment récupérer les attributs (prives) 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
46
❖ On l’utilise comme un attribut
Classes
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; }
47
Pour tester
console.log(personne.num); // affiche 1
Constructeur
❖ 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
Hypothèse
Et si nous voulions qu’un attribut ait une valeur partag´ee par toutes les
instances (par
exemple, le nombre d’objets instanciés de la classe Personne)
Solution : attribut statique ou attribut de classe
50
Un attribut dont la valeur est partagée par toutes les instances de la classe.
Exemple
Si on voulait créer un attribut contenant le nombre d’objets crées à
partir de la classe Personne
Notre attribut doit être déclare static, sinon chaque objet pourrait avoir sa
propre valeur pour cet attribut
Incrémentons notre compteur de personnes dans les constructeurs
public constructor(private _num?: number, private _nom?: string, private _prenom?: string) {
Personne._nbrPersonnes++;
}
51
Héritage
❖ 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 };
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
52
❖ En plus, les deux partagent plusieurs attributs tels que numéro, nom et prénom
❖ Donc, on peut utiliser la classe Personne puisqu’elle contient tous les attributs numéro, nom
et prénom
Particularité du langage TypeScript
Une classe ne peut hériter que d’une seule classe
L’héritage multiple est donc non-autorisé.
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 numéro s’il est personne,
soit le salaire s’il est enseignant ou soit le niveau s’il est étudiant.
54
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 {
abstract afficherDetails(): void ;
….
}
Méthode
55 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