Les classes en TypeScript
Cet article explique les classes en TypeScript.
YouTube Video
Les classes en TypeScript
Les classes en TypeScript sont basées sur les classes ES6 de JavaScript et offrent des fonctionnalités supplémentaires telles que les annotations de type et les modificateurs d'accès. Cela vous permet de tirer parti des concepts de la programmation orientée objet tout en garantissant une sécurité des types plus robuste et claire.
Voici des explications sur l'utilisation de base et les fonctionnalités des classes en TypeScript.
Définition de base d'une classe
1class Person {
2 name: string; // Member variable
3 age: number; // Member variable
4
5 // Constructor
6 constructor(name: string, age: number) {
7 this.name = name;
8 this.age = age;
9 }
10
11 // Method
12 greet(): void {
13 console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
14 }
15}
16
17const person = new Person("Alice", 25);
18person.greet(); // Hello, my name is Alice and I am 25 years old.
name
etage
sont des propriétés (variables membres) de la classe.- Le
constructor
est une méthode appelée lors de la création d'une instance d'une classe, qui prend des arguments et attribue des valeurs aux propriétés. greet
est une méthode de la classe, indiquant qu'elle n'a pas de valeur de retour en étant de typevoid
.
Modificateurs d'accès
En TypeScript, vous pouvez utiliser des modificateurs d'accès (public
, private
, protected
) pour contrôler l'accès aux propriétés et méthodes d'une classe.
public
Par défaut, toutes les propriétés et méthodes sont public
. Cela signifie qu'elles peuvent être accessibles depuis l'extérieur de la classe.
1class Animal {
2 public species: string;
3
4 constructor(species: string) {
5 this.species = species;
6 }
7
8 public makeSound(): void {
9 console.log(`${this.species} makes a sound.`);
10 }
11}
12
13const animal = new Animal("Dog");
14console.log(animal.species); // Dog
15animal.makeSound(); // Dog makes a sound.
- La propriété
species
et la méthodemakeSound
sont déclarées commepublic
et peuvent être accessibles depuis l'extérieur de la classe.
private
L'utilisation du modificateur private
empêche l'accès aux propriétés ou méthodes depuis l'extérieur de la classe.
1class Car {
2 private brand: string;
3
4 constructor(brand: string) {
5 this.brand = brand;
6 }
7
8 public getBrand(): string {
9 return this.brand;
10 }
11}
12
13const car = new Car("Toyota");
14// console.log(car.brand); // Error: 'brand' is private and cannot be accessed.
15console.log(car.getBrand()); // Toyota
- La propriété
brand
est déclarée commeprivate
, donc elle ne peut pas être accessible depuis l'extérieur de la classe. - L'encapsulation des données peut être réalisée en cachant des propriétés avec le modificateur
private
.
protected
Le modificateur protected
restreint l'accès depuis l'extérieur de la classe mais le permet dans les sous-classes (classes dérivées).
1class Vehicle {
2 protected model: string;
3
4 constructor(model: string) {
5 this.model = model;
6 }
7}
8
9class Truck extends Vehicle {
10 public getModel(): string {
11 return this.model;
12 }
13}
14
15const truck = new Truck("Ford F-150");
16console.log(truck.getModel()); // Ford F-150
17
18// console.log(truck.model);
19// Error: Property 'model' is protected and only accessible within class 'Vehicle' and its subclasses.
- La propriété
model
est déclarée commeprotected
, donc elle ne peut pas être accessible depuis l'extérieur de la classe, mais elle peut l'être depuis les sous-classes.
Accesseurs et mutateurs (Getters et Setters)
En TypeScript, vous pouvez définir des accesseurs et des mutateurs à l'aide des mots-clés get
et set
pour récupérer et définir des valeurs de propriété.
1class Employee {
2 private _salary: number;
3
4 constructor(salary: number) {
5 this._salary = salary;
6 }
7
8 // Getter
9 get salary(): number {
10 return this._salary;
11 }
12
13 // Setter
14 set salary(newSalary: number) {
15 if (newSalary > 0) {
16 this._salary = newSalary;
17 } else {
18 console.log("Salary must be positive.");
19 }
20 }
21}
22
23const employee = new Employee(50000);
24console.log(employee.salary); // 50000
25employee.salary = 60000;
26console.log(employee.salary); // 60000
27employee.salary = -100; // Salary must be positive.
- Dans cet exemple, un getter et un setter sont utilisés pour la propriété
salary
afin de contrôler l'accès extérieur et les mises à jour. Le setter effectue une validation pour empêcher les valeurs négatives et affiche un message d'avertissement si une valeur invalide est fournie.
Héritage
En TypeScript, les classes peuvent être héritées. En utilisant le mot-clé extends
, vous pouvez hériter des fonctionnalités d'une classe parente.
1class Animal {
2 constructor(public name: string) {}
3
4 public move(): void {
5 console.log(`${this.name} is moving.`);
6 }
7}
8
9class Bird extends Animal {
10 public fly(): void {
11 console.log(`${this.name} is flying.`);
12 }
13}
14
15const bird = new Bird("Sparrow");
16bird.move(); // Sparrow is moving.
17bird.fly(); // Sparrow is flying.
- Dans cet exemple, la classe
Bird
hérite de la classeAnimal
, ce qui lui permet d'utiliser la méthodemove
d'Animal
. De plus, elle définit sa propre méthodefly
, ajoutant de nouvelles fonctionnalités tout en héritant des caractéristiques de la classe parente.
Classes abstraites
Les classes abstraites (abstract
) ne peuvent pas être instanciées directement et sont utilisées comme modèles pour fournir des implémentations concrètes dans les sous-classes.
1abstract class Shape {
2 abstract getArea(): number;
3
4 public describe(): void {
5 console.log("This is a shape.");
6 }
7}
8
9class Circle extends Shape {
10 constructor(private radius: number) {
11 super();
12 }
13
14 public getArea(): number {
15 return Math.PI * this.radius * this.radius;
16 }
17}
18
19const circle = new Circle(5);
20console.log(circle.getArea()); // 78.53981633974483
21circle.describe(); // This is a shape.
- Dans cet exemple,
Shape
est définie comme une classe abstraite etgetArea
est une méthode abstraite qui doit être implémentée par les sous-classes. La classeCircle
hérite de cette classe abstraite et implémente sa propre méthodegetArea
pour calculer l'aire d'un cercle. De plus, des méthodes concrètes commedescribe
sont héritées en tant que fonctionnalités communes et peuvent être utilisées telles quelles.
Relation avec les interfaces
Les classes peuvent implémenter des interfaces, garantissant qu'elles possèdent des propriétés et méthodes spécifiques.
1interface Flyable {
2 fly(): void;
3}
4
5class Airplane implements Flyable {
6 public fly(): void {
7 console.log("The airplane is flying.");
8 }
9}
10
11const airplane: Flyable = new Airplane();
12airplane.fly(); // The airplane is flying.
- Dans cet exemple, l'interface
Flyable
définit la spécification pour la méthodefly
, et la classeAirplane
implémente cette interface en fournissant une définition concrète de la méthodefly
. Ainsi, tout objet pouvant être considéré comme de typeFlyable
est garanti de posséder une méthodefly
.
Membres statiques
Lorsque vous définissez des membres statiques dans une classe, ces méthodes et propriétés sont associées à la classe elle-même. Les membres statiques peuvent être appelés sans instancier la classe.
1class MathUtils {
2 static PI: number = 3.14;
3
4 static add(a: number, b: number): number {
5 return a + b;
6 }
7}
8
9console.log(MathUtils.add(10, 20)); // 30
10console.log(MathUtils.PI); // 3.14
- Vous définissez des méthodes statiques en utilisant le mot-clé
static
. - Dans cet exemple, la classe
MathUtils
définit une méthode statiqueadd
et une propriété statiquePI
. - Les membres statiques n'appartiennent pas aux instances de la classe, mais peuvent être appelés directement depuis la classe elle-même.
Résumé
Les classes TypeScript ajoutent des fonctionnalités telles que la sécurité des types, les modificateurs d'accès et les classes abstraites à la fonctionnalité des classes JavaScript. Cela permet une programmation orientée objet plus puissante et plus sécurisée.
Vous pouvez suivre l'article ci-dessus avec Visual Studio Code sur notre chaîne YouTube. Veuillez également consulter la chaîne YouTube.