一、基本概念
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类的区别
TypeScript类有类型注解
支持访问修饰符(public/private/protected)
支持抽象类和抽象方法
支持参数属性
支持接口实现检查
八、最佳实践
优先使用private/protected限制成员访问
考虑使用抽象类定义通用行为
合理使用接口来定义类的公共契约
对于简单的数据对象,考虑使用接口而不是类
TypeScript的类提供了强大的面向对象编程能力,同时保持了JavaScript的灵活性,是构建大型应用的理想选择。