Klassen in TypeScript
In dit artikel worden klassen in TypeScript uitgelegd.
YouTube Video
Klassen in TypeScript
Klassen in TypeScript zijn gebaseerd op de ES6-klassen van JavaScript en bieden extra functies zoals typeannotaties en toegangsmodificatoren. Dit stelt je in staat de concepten van objectgeoriënteerd programmeren te benutten, terwijl je zorgt voor een robuustere en duidelijkere typestrictheid.
Hieronder volgen uitleggen over het basisgebruik en de functies van klassen in TypeScript.
Basisdefinitie van een klasse
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
enage
zijn eigenschappen (lidvariabelen) van de klasse.- De
constructor
is een methode die wordt aangeroepen bij het aanmaken van een instantie van een klasse, die argumenten accepteert en waarden toekent aan eigenschappen. greet
is een methode van de klasse, die aangeeft dat het geen retourwaarde heeft omdat het van het typevoid
is.
Toegangsmodificatoren
In TypeScript kun je toegangsmodificatoren (public
, private
, protected
) gebruiken om de toegang tot eigenschapen en methoden van een klasse te beheersen.
public
Standaard zijn alle eigenschappen en methoden public
. Dit betekent dat ze van buiten de klasse toegankelijk zijn.
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.
- De eigenschap
species
en de methodemakeSound
zijn alspublic
gedeclareerd en kunnen van buiten de klasse worden benaderd.
private
Het gebruik van de private
-modificator voorkomt toegang tot de eigenschappen of methoden vanaf buiten de klasse.
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
- De eigenschap
brand
is alsprivate
gedeclareerd en kan daarom niet van buiten de klasse worden benaderd. - Het kapselen van data kan worden bereikt door eigenschappen te verbergen met de
private
modifier.
protected
De protected
-modificator beperkt de toegang van buiten de klasse, maar staat toegang toe in klassen die van de klasse afleiden (subklassen).
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.
- De eigenschap
model
is alsprotected
gedeclareerd; het kan dus niet van buiten de klasse worden benaderd, maar wel vanuit subklassen.
Getters en Setters
In TypeScript kun je getters en setters definiëren met behulp van de trefwoorden get
en set
om eigenschapswaarden op te halen en in te stellen.
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.
- In dit voorbeeld worden een getter en een setter gebruikt voor de eigenschap
salary
om externe toegang en bijwerking te controleren. De setter voert een validatie uit om negatieve waarden te voorkomen, en geeft een waarschuwing als een ongeldige waarde wordt opgegeven.
Overerving
In TypeScript kunnen klassen worden overgeërfd. Met behulp van het trefwoord extends
kun je functionaliteit overerven van een bovenliggende klasse.
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.
- In dit voorbeeld erft de klasse
Bird
van de klasseAnimal
, waardoor het de methodemove
vanAnimal
kan gebruiken. Bovendien definieert het zijn eigen methodefly
, waardoor nieuwe functionaliteit wordt toegevoegd terwijl kenmerken van de bovenliggende klasse worden geërfd.
Abstracte Klassen
Abstracte klassen (abstract
) kunnen niet direct worden geïnstantieerd en worden gebruikt als sjablonen om concrete implementaties in subklassen te bieden.
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.
- In dit voorbeeld is
Shape
gedefinieerd als een abstracte klasse en isgetArea
een abstracte methode die door subklassen moet worden geïmplementeerd. De klasseCircle
erft deze abstracte klasse en implementeert zijn eigen methodegetArea
om de oppervlakte van een cirkel te berekenen. Daarnaast worden concrete methoden zoalsdescribe
als gemeenschappelijke functionaliteit geërfd en kunnen ze direct worden gebruikt.
Relatie met Interfaces
Klassen kunnen interfaces implementeren, waarmee wordt gegarandeerd dat ze specifieke eigenschappen en methoden hebben.
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.
- In dit voorbeeld definieert de interface
Flyable
de specificatie voor de methodefly
, en de klasseAirplane
implementeert deze interface door een concrete implementatie van de methodefly
te bieden. Hierdoor is elk object dat als eenFlyable
type kan worden behandeld gegarandeerd voorzien van eenfly
methode.
Statische leden
Wanneer je statische leden in een klasse definieert, zijn die methoden en eigenschappen aan de klasse zelf gekoppeld. Statische leden kunnen worden aangeroepen zonder een instantie van de klasse te maken.
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
- Je definieert statische methoden met behulp van het sleutelwoord
static
. - In dit voorbeeld definieert de klasse
MathUtils
een statische methodeadd
en een statische eigenschapPI
. - Statische leden behoren niet tot klasse-instanties, maar kunnen direct vanuit de klasse zelf worden aangeroepen.
Samenvatting
TypeScript-klassen voegen functies zoals typestrictheid, toegangsmodificatoren en abstracte klassen toe aan de functionaliteit van JavaScript-klassen. Dit maakt krachtiger en veiliger objectgeoriënteerd programmeren mogelijk.
Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.