TypeScript:类
一、基本概念
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的灵活性,是构建大型应用的理想选择。