在 TypeScript 中,類別(Classes)提供了一個面向對象編程的方式,讓我們能夠更有效地組織和重用程式碼。類別不僅可以定義物件的結構,還可以包含行為邏輯,從而建立更具模組化的程式設計模式。TypeScript 加強了 JavaScript 的類別功能,提供了型別檢查和其他強大的功能,讓我們能夠更安全地編寫程式。
類別的定義與 JavaScript 類似,但 TypeScript 讓我們可以指定元素的型別並進行更嚴格的型別檢查。以下是一個簡單的類別範例:
// 定義一個類別
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): string {
return `Hello, my name is ${this.name} and I am ${this.age} years old.`;
}
}
// 使用類別來創建物件
const person = new Person("John", 30);
console.log(person.greet()); // Hello, my name is John and I am 30 years old.
在這個範例中,我們定義了一個 Person 類別,這個類別有兩個屬性 name 和 age,以及一個方法 greet。類別的建構函式(constructor)用來初始化物件的屬性。
TypeScript 支援三種主要的存取修飾符,分別是 public、private 和 protected,用來控制類別元素的可見性。
以下範例展示了不同的存取修飾符應用:
// 使用存取修飾符
class Employee {
public name: string;
private salary: number;
protected position: string;
constructor(name: string, salary: number, position: string) {
this.name = name;
this.salary = salary;
this.position = position;
}
public getDetails(): string {
return `${this.name} is a ${this.position}.`;
}
private calculateBonus(): number {
return this.salary * 0.1;
}
}
const employee = new Employee("Annie", 1000000, "Developer");
console.log(employee.getDetails()); // Annie is a Developer
console.log(employee.salary); // Error: Property 'salary' is private
console.log(employee.calculateBonus()); // Error: Method 'calculateBonus' is private
在這個例子中,name
是 public
元素,可以在類別外部存取;salary
是 private
元素,只有在類別內部才能存取;position
是 protected
元素,子類別可以存取,但外部無法存取。
TypeScript 支援類別的繼承,這讓我們可以基於現有類別另外擴展功能。透過 extends
關鍵字,我們可以建立一個子類別來繼承父類別的屬性和方法:
// 定義父類別
class Animal {
species: string;
constructor(species: string) {
this.species = species;
}
sound(): string {
return `${this.species} makes a sound.`;
}
}
// 定義子類別
class Cat extends Animal {
constructor() {
super("Cat");
}
sound(): string {
return `${this.species} meow.`;
}
}
const dog = new Cat();
console.log(dog.sound()); // Cat meow.
在這個範例裡,Cat
類別繼承了 Animal
類別,並覆寫了 sound
方法。super
關鍵字用來呼叫父類別的建構函式。
抽象類別是不能被直接實例化的類別,只能被其他類別繼承。它們通常用來定義一個基礎類別,強制子類別實現某些方法。抽象類別可以包含抽象方法和具體方法:
// 定義抽象類別
abstract class Shape {
abstract area(): number;
describe(): string {
return "This is a shape.";
}
}
// 繼承抽象類別
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(10);
console.log(circle.area()); // 314.159...
console.log(circle.describe()); // This is a shape.
在這裡,Shape
是一個抽象類別,它要求所有子類別必須實作 area
方法,這樣可以確保每個形狀都有自己計算面積的邏輯。
TypeScript 的類別提供了強大的類別設計功能,透過型別檢查和存取控制,我們能夠寫出更安全和可維護的程式碼。類別的基礎概念,和存取修飾符、繼承和抽象類別等應用,都能夠幫助我們提升專案的靈活組織度和功能擴展性。