TypeScript类详解 – wiki基地

TypeScript 类详解

TypeScript 作为 JavaScript 的超集,引入了强大的类型系统,显著提升了代码的可读性、可维护性和可预测性。其中,类是 TypeScript 中一个至关重要的概念,它提供了面向对象编程的核心构建块,允许开发者创建具有特定属性和方法的对象蓝图。本文将深入探讨 TypeScript 类的各个方面,涵盖其基本语法、高级特性以及最佳实践。

1. 类的基本结构

一个 TypeScript 类通常包含以下几个核心组成部分:

  • class 关键字: 用于声明一个类。
  • 类名: 遵循 PascalCase 命名规范。
  • 属性 (Properties): 描述类的状态,定义对象的数据特征。
  • 构造函数 (Constructor): 用于初始化类的实例。
  • 方法 (Methods): 定义类的行为,执行特定的操作。

“`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.;
}
}

let person = new Person(“Alice”, 30);
console.log(person.greet()); // Output: Hello, my name is Alice and I am 30 years old.
“`

2. 访问修饰符

TypeScript 提供了三种访问修饰符来控制类成员的可见性:

  • public (默认): 成员可以在任何地方访问。
  • private: 成员只能在类内部访问。
  • protected: 成员可以在类及其子类内部访问。

“`typescript
class Employee {
public name: string;
private salary: number;
protected department: string;

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

getSalaryInfo(): string {
return Salary: ${this.salary}; // 可以在类内部访问 private 成员
}
}

class Manager extends Employee {
getDepartmentInfo(): string {
return Department: ${this.department}; // 可以在子类中访问 protected 成员
}
}

let employee = new Employee(“Bob”, 50000, “Engineering”);
console.log(employee.name); // 可以访问 public 成员
// console.log(employee.salary); // Error: Cannot access private member
// console.log(employee.department); // Error: Cannot access protected member

let manager = new Manager(“Carol”, 80000, “Management”);
console.log(manager.getDepartmentInfo()); // 可以通过子类方法访问 protected 成员
“`

3. readonly 修饰符

readonly 修饰符用于声明只读属性,其值只能在构造函数中初始化,之后不能再修改。

“`typescript
class Product {
readonly id: number;
name: string;

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

let product = new Product(1, “Laptop”);
// product.id = 2; // Error: Cannot assign to ‘id’ because it is a read-only property.
“`

4. 继承

TypeScript 支持类的继承,使用 extends 关键字实现。子类继承父类的属性和方法,并可以添加自己的成员或重写父类的方法。

“`typescript
class Animal {
name: string;

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

move(distanceInMeters = 0): void {
console.log(${this.name} moved ${distanceInMeters}m.);
}
}

class Dog extends Animal {
bark(): void {
console.log(“Woof! Woof!”);
}
}

const dog = new Dog(“Buddy”);
dog.move(10); // Output: Buddy moved 10m.
dog.bark(); // Output: Woof! Woof!
“`

5. 抽象类

抽象类使用 abstract 关键字声明,不能被直接实例化。它可以用作其他类的基类,并可以定义抽象方法,子类必须实现这些方法。

“`typescript
abstract class Shape {
abstract calculateArea(): number;
}

class Circle extends Shape {
radius: number;

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

calculateArea(): number {
return Math.PI * this.radius * this.radius;
}
}
“`

6. 接口与类

接口可以用来定义类的结构,类可以使用 implements 关键字实现接口。

“`typescript
interface Drawable {
draw(): void;
}

class Square implements Drawable {
side: number;

constructor(side: number) {
this.side = side;
}

draw(): void {
console.log(“Drawing a square with side length:”, this.side);
}
}
“`

7. 静态成员

静态成员属于类本身,而不是类的实例。可以使用 static 关键字声明静态属性和方法。

“`typescript
class Counter {
static count: number = 0;

static increment(): void {
Counter.count++;
}
}

Counter.increment();
console.log(Counter.count); // Output: 1
“`

8. 泛型类

泛型类允许在定义类时使用类型参数,从而提高代码的灵活性和可重用性.

“`typescript
class DataHolder {
data: T;

constructor(data: T) {
this.data = data;
}
}

let numberHolder = new DataHolder(123);
let stringHolder = new DataHolder(“hello”);
“`

9. 高级特性:Mixin

Mixin 是一种通过组合多个类来创建新类的技术,可以提高代码的可复用性和灵活性。TypeScript 不直接支持 Mixin,但可以通过一些技巧实现类似的功能。

10. 最佳实践

  • 使用访问修饰符来控制成员的可见性,提高代码的封装性。
  • 使用 readonly 修饰符保护只读属性。
  • 使用接口定义类的结构,提高代码的可读性和可维护性。
  • 使用泛型类提高代码的灵活性和可重用性。
  • 避免过度使用继承,优先考虑组合。

总结:

TypeScript 的类提供了丰富的特性,使得开发者能够以面向对象的方式构建复杂的应用程序。理解类的基本语法、高级特性以及最佳实践对于编写高质量的 TypeScript 代码至关重要。 通过本文的介绍,希望能帮助读者更全面地了解 TypeScript 类的各个方面,并将其应用于实际开发中。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部