TypeScript:类

发布于:2025-05-16 ⋅ 阅读:(9) ⋅ 点赞:(0)

一、基本概念

TypeScript 类是基于 ES6 类的语法扩展,增加了类型注解和访问修饰符等特性,提供了更强大的面向对象编程能力。

二、基本语法

class Person {
  name: string;
  age: number;

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

  greet() {
    return `Hello, my name is ${this.name}`;
  }
}

三、类的主要特性

1. 访问修饰符

  • public (默认):成员在任何地方都可访问

  • private:只能在类内部访问

  • protected:可在类及其子类中访问

class Animal {
  public name: string;
  private secret: string;
  protected age: number;
}

2. 只读属性

class Person {
  readonly birthDate: Date;
}

3. 参数属性

简化属性声明和赋值的语法:

class Person {
  constructor(public name: string, private age: number) {}
  // 等同于声明name和age并在构造函数中赋值
}

4. 存取器 (getters/setters)

class Employee {
  private _salary: number;

  get salary(): number {
    return this._salary;
  }

  set salary(newSalary: number) {
    if (newSalary >= 0) {
      this._salary = newSalary;
    }
  }
}

5. 静态成员

class Grid {
  static origin = { x: 0, y: 0 };
  
  static calculateDistance(point: {x: number, y: number}) {
    // ...
  }
}

6. 抽象类

abstract class Animal {
  abstract makeSound(): void; // 必须在派生类中实现

  move(): void {
    console.log("moving...");
  }
}

7. 类与接口

类可以实现接口:

interface ClockInterface {
  currentTime: Date;
  setTime(d: Date): void;
}

class Clock implements ClockInterface {
  currentTime: Date = new Date();
  setTime(d: Date) {
    this.currentTime = d;
  }
}

四、继承

class Animal {
  move(distance: number = 0) {
    console.log(`Moved ${distance}m`);
  }
}

class Dog extends Animal {
  bark() {
    console.log("Woof! Woof!");
  }
}

五、方法重写

class Animal {
  move(distance: number = 0) {
    console.log(`Moved ${distance}m`);
  }
}

class Snake extends Animal {
  move(distance: number = 5) {
    console.log("Slithering...");
    super.move(distance);
  }
}

六、高级特性

1. 类类型

类既可以作为值使用,也可以作为类型使用:

class Greeter {
  greeting: string;
  
  constructor(message: string) {
    this.greeting = message;
  }
}

let greeter: Greeter = new Greeter("world");

2. 构造函数类型

class Point {
  x: number;
  y: number;
}

let PointConstructor: typeof Point = Point;
let point: Point = new PointConstructor();

3. 装饰器 (实验性特性)

@sealed
class Greeter {
  greeting: string;
  
  constructor(message: string) {
    this.greeting = message;
  }

  @enumerable(false)
  greet() {
    return "Hello, " + this.greeting;
  }
}

七、与ES6类的区别

  1. TypeScript类有类型注解

  2. 支持访问修饰符(public/private/protected)

  3. 支持抽象类和抽象方法

  4. 支持参数属性

  5. 支持接口实现检查

八、最佳实践

  1. 优先使用private/protected限制成员访问

  2. 考虑使用抽象类定义通用行为

  3. 合理使用接口来定义类的公共契约

  4. 对于简单的数据对象,考虑使用接口而不是类

TypeScript的类提供了强大的面向对象编程能力,同时保持了JavaScript的灵活性,是构建大型应用的理想选择。


网站公告

今日签到

点亮在社区的每一天
去签到