TypeScript 类
最后修改时间:2025年3月3日
TypeScript 中的类提供了定义对象蓝图的方式。它们支持继承、封装和多态。本教程将通过实际示例探讨类语法、构造函数、访问修饰符和高级模式。
基本类语法
TypeScript 中的类使用 class
关键字定义。它可以包含属性、方法和构造函数。
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("Alice", 30); console.log(person.greet()); // Output: Hello, my name is Alice and I am 30 years old.
Person
类具有 name
和 age
属性,用于初始化它们的构造函数,以及一个 greet
方法。
继承
TypeScript 使用 extends
关键字支持继承。子类继承父类的属性和方法。
class Employee extends Person { employeeId: number; constructor(name: string, age: number, employeeId: number) { super(name, age); this.employeeId = employeeId; } displayId(): string { return `Employee ID: ${this.employeeId}`; } } const employee = new Employee("Bob", 25, 12345); console.log(employee.greet()); // Output: Hello, my name is Bob and I am 25 years old. console.log(employee.displayId()); // Output: Employee ID: 12345
Employee
类扩展了 Person
类,并添加了新的 employeeId
属性和 displayId
方法。
访问修饰符
TypeScript 提供了 public
、private
和 protected
等访问修饰符来控制属性和方法的可见性。
class BankAccount { private balance: number; constructor(initialBalance: number) { this.balance = initialBalance; } deposit(amount: number): void { this.balance += amount; } getBalance(): number { return this.balance; } } const account = new BankAccount(1000); account.deposit(500); console.log(account.getBalance()); // Output: 1500
balance
属性是私有的,只能在类内部访问。deposit
和 getBalance
等公共方法提供了受控访问。
只读属性
标记为 readonly
的属性只能在初始化时赋值,之后不能修改。
class Car { readonly make: string; readonly model: string; constructor(make: string, model: string) { this.make = make; this.model = model; } } const myCar = new Car("Toyota", "Corolla"); console.log(myCar.make); // Output: Toyota
make
和 model
属性在初始化后是不可变的。
静态属性和方法
静态属性和方法属于类本身而不是实例。它们使用类名进行访问。
class MathOperations { static PI: number = 3.14; static calculateArea(radius: number): number { return this.PI * radius * radius; } } console.log(MathOperations.calculateArea(5)); // Output: 78.5
PI
属性和 calculateArea
方法是静态的,可以直接通过类访问。
抽象类
抽象类不能直接实例化。它们用作其他类的基类,并可以定义抽象方法。
abstract class Animal { abstract makeSound(): void; move(): void { console.log("Moving..."); } } class Dog extends Animal { makeSound(): void { console.log("Woof!"); } } const dog = new Dog(); dog.makeSound(); // Output: Woof! dog.move(); // Output: Moving...
Animal
类是抽象的,并定义了一个抽象方法 makeSound
。Dog
类实现了这个方法。
Getter 和 Setter
Getter 和 Setter 允许受控访问类属性。它们使用 get
和 set
关键字定义。
class Temperature { private _celsius: number = 0; get celsius(): number { return this._celsius; } set celsius(value: number) { if (value < -273.15) { throw new Error("Temperature below absolute zero is not possible."); } this._celsius = value; } } const temp = new Temperature(); temp.celsius = 25; console.log(temp.celsius); // Output: 25
celsius
属性通过 getter 和 setter 进行访问和修改,确保了值的有效性。
接口与类
接口定义了类的契约。实现接口的类必须遵守其结构。
interface Drivable { start(): void; stop(): void; } class Car implements Drivable { start(): void { console.log("Car started."); } stop(): void { console.log("Car stopped."); } } const myCar = new Car(); myCar.start(); // Output: Car started. myCar.stop(); // Output: Car stopped.
Car
类实现了 Drivable
接口,确保它具有 start
和 stop
方法。
最佳实践
- 封装: 使用访问修饰符保护数据。
- 单一职责: 使类专注于一项任务。
- 继承: 使用继承避免代码重复。
- 接口: 使用接口定义类的契约。
- 静态成员: 使用静态成员共享功能。
来源
本教程通过实际示例介绍了 TypeScript 类。实现这些模式可以编写更清晰、更易于维护的代码。