Classi in TypeScript
Questo articolo spiega le classi in TypeScript.
YouTube Video
Classi in TypeScript
Le classi in TypeScript si basano sulle classi ES6 di JavaScript e offrono funzionalità aggiuntive come annotazioni di tipo e modificatori di accesso. Questo ti permette di sfruttare i concetti della programmazione orientata agli oggetti garantendo al contempo una sicurezza dei tipi più robusta e chiara.
Di seguito sono riportate le spiegazioni sull'uso di base e sulle funzionalità delle classi in TypeScript.
Definizione di Base della 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
eage
sono proprietà (variabili membro) della classe.- Il
constructor
è un metodo chiamato durante la creazione di un'istanza di una classe, che accetta argomenti e assegna valori alle proprietà. greet
è un metodo della classe, che indica di non avere un valore restituito grazie al tipovoid
.
Modificatori di Accesso
In TypeScript, puoi utilizzare i modificatori di accesso (public
, private
, protected
) per controllare l'accesso alle proprietà e ai metodi della classe.
public
Per impostazione predefinita, tutte le proprietà e i metodi sono public
. Ciò significa che possono essere accessibili dall'esterno della 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 proprietà
species
e il metodomakeSound
sono dichiarati comepublic
e possono essere accessi dall'esterno della classe.
private
L'utilizzo del modificatore private
impedisce l'accesso alle proprietà o ai metodi dall'esterno della 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 proprietà
brand
è dichiarata comeprivate
, quindi non può essere accessa dall'esterno della classe. - L'incapsulamento dei dati può essere ottenuto nascondendo le proprietà con il modificatore
private
.
protected
Il modificatore protected
limita l'accesso dall'esterno della classe ma lo consente nelle sottoclassi (classi derivate).
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 proprietà
model
è dichiarata comeprotected
, quindi non può essere accessa dall'esterno della classe, ma può essere accessa dalle sottoclassi.
Getter e Setter
In TypeScript, puoi definire getter e setter utilizzando le parole chiave get
e set
per recuperare e impostare i valori delle proprietà.
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 questo esempio, un getter e un setter vengono utilizzati per la proprietà
salary
per controllare l'accesso e gli aggiornamenti esterni. Il setter esegue una validazione per prevenire valori negativi e mostra un messaggio di avviso se viene fornito un valore non valido.
Ereditarietà
In TypeScript, le classi possono essere ereditate. Utilizzando la parola chiave extends
, puoi ereditare funzionalità da una classe genitore.
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 questo esempio, la classe
Bird
eredita dalla classeAnimal
, il che le consente di utilizzare il metodomove
diAnimal
. Inoltre, definisce il proprio metodofly
, aggiungendo nuove funzionalità pur ereditando le caratteristiche dalla classe madre.
Classi Astratte
Le classi astratte (abstract
) non possono essere istanziate direttamente e vengono utilizzate come modelli per fornire implementazioni concrete nelle sottoclassi.
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 questo esempio,
Shape
è definita come una classe astratta, egetArea
è un metodo astratto che deve essere implementato dalle sottoclassi. La classeCircle
eredita questa classe astratta e implementa il proprio metodogetArea
per calcolare l'area di un cerchio. Inoltre, i metodi concreti comedescribe
sono ereditati come funzionalità comuni e possono essere utilizzati così come sono.
Relazione con le Interfacce
Le classi possono implementare interfacce, garantendo che dispongano di proprietà e metodi specifici.
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 questo esempio, l'interfaccia
Flyable
definisce la specifica per il metodofly
e la classeAirplane
implementa questa interfaccia fornendo una definizione concreta per il metodofly
. In questo modo, qualsiasi oggetto che può essere trattato come un tipoFlyable
è garantito di avere un metodofly
.
Membri Statici
Quando definisci membri statici in una classe, quei metodi e proprietà sono associati direttamente alla classe stessa. I membri statici possono essere chiamati senza istanziare 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
- I metodi statici si definiscono usando la parola chiave
static
. - In questo esempio, la classe
MathUtils
definisce un metodo staticoadd
e una proprietà staticaPI
. - I membri statici non appartengono alle istanze della classe, ma possono essere chiamati direttamente dalla classe stessa.
Riepilogo
Le classi di TypeScript aggiungono funzionalità come sicurezza dei tipi, modificatori di accesso e classi astratte alla funzionalità delle classi JavaScript. Questo consente una programmazione orientata agli oggetti più potente e sicura.
Puoi seguire l'articolo sopra utilizzando Visual Studio Code sul nostro canale YouTube. Controlla anche il nostro canale YouTube.