POO en TypeScript

Classes

Les classes en TypeScript sont des modèles pour créer des objets. Une classe encapsule des données pour l'objet et des méthodes pour manipuler ces données.


class Person {
    name: string;
    age: number;

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    greet() {
        console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
    }
}

const person1 = new Person("Alice", 30);
person1.greet();  // Output: Hello, my name is Alice and I am 30 years old.
            

Héritage

L'héritage permet à une classe de dériver des propriétés et des méthodes d'une autre classe.


class Employee extends Person {
    employeeId: number;

    constructor(name: string, age: number, employeeId: number) {
        super(name, age);
        this.employeeId = employeeId;
    }

    displayEmployeeInfo() {
        console.log(`Employee ID: ${this.employeeId}`);
    }
}

const employee1 = new Employee("Bob", 25, 1234);
employee1.greet();  // Output: Hello, my name is Bob and I am 25 years old.
employee1.displayEmployeeInfo();  // Output: Employee ID: 1234
            

Modificateurs d'accès

TypeScript prend en charge les modificateurs d'accès public, private, et protected pour contrôler la visibilité des membres de classe.


class Car {
    private engine: string;

    constructor(engine: string) {
        this.engine = engine;
    }

    startEngine() {
        console.log(`Engine ${this.engine} started.`);
    }
}

const myCar = new Car("V8");
// myCar.engine; // Error: Property 'engine' is private and only accessible within class 'Car'.
myCar.startEngine();  // Output: Engine V8 started.
            

Interfaces

Les interfaces définissent des contrats que les classes peuvent implémenter. Elles ne contiennent pas de code exécutable.


interface Drivable {
    start(): void;
    stop(): void;
}

class Vehicle implements Drivable {
    start() {
        console.log("Vehicle started");
    }

    stop() {
        console.log("Vehicle stopped");
    }
}

const myVehicle = new Vehicle();
myVehicle.start();  // Output: Vehicle started
myVehicle.stop();  // Output: Vehicle stopped
            

Polymorphisme

Le polymorphisme permet d'utiliser une méthode de manière différente selon le contexte d'exécution.


class Animal {
    makeSound() {
        console.log("Some generic animal sound");
    }
}

class Dog extends Animal {
    makeSound() {
        console.log("Bark");
    }
}

class Cat extends Animal {
    makeSound() {
        console.log("Meow");
    }
}

const animals: Animal[] = [new Dog(), new Cat()];
animals.forEach(animal => animal.makeSound());
// Output:
// Bark
// Meow
            

Classes Abstraites

Les classes abstraites ne peuvent pas être instanciées directement. Elles sont destinées à être héritées par d'autres classes qui implémenteront les méthodes abstraites définies.


abstract class Shape {
    abstract area(): number;
}

class Circle extends Shape {
    radius: number;

    constructor(radius: number) {
        super();
        this.radius = radius;
    }

    area(): number {
        return Math.PI * this.radius * this.radius;
    }
}

const circle = new Circle(5);
console.log(circle.area());  // Output: 78.53981633974483