TypeScript 类与面向对象
TypeScript 类语法与 ES6 一致,额外支持类型注解与访问修饰符,下面梳理核心用法。
类基础语法
定义类
TypeScript
class Person {
// 属性声明
name: string;
age: number;
// 构造函数
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// 方法
greet(): string {
return `Hello, I'm ${this.name}, ${this.age} years old.`;
}
}
const p = new Person("Alice", 25);
console.log(p.greet());
参数属性(简化写法)
构造函数参数前加访问修饰符,自动创建并赋值属性:
TypeScript
class Person {
// 一行等价于上面的 name/age + constructor
constructor(public name: string, public age: number) {}
greet(): string {
return `Hello, I'm ${this.name}`;
}
}
访问修饰符
| 修饰符 | 说明 |
|---|---|
public | 默认,任何地方可访问 |
private | 仅类内部可访问(包括子类) |
protected | 类内部与子类可访问 |
readonly | 只读,初始化后不可修改 |
TypeScript
class Employee {
public readonly id: string;
private salary: number;
protected department: string;
constructor(id: string, salary: number, department: string) {
this.id = id;
this.salary = salary;
this.department = department;
}
}
构造函数
构造函数是类实例化时自动执行的方法:
TypeScript
class Database {
private connection: string;
constructor(host: string, port: number) {
this.connection = `${host}:${port}`;
}
}
// new 时自动调用 constructor
const db = new Database("localhost", 5432);
注意:派生类构造函数中必须先调用
super(),才能使用this。
类继承
extends 继承
TypeScript
class Animal {
constructor(protected name: string) {}
move(distance: number): void {
console.log(`${this.name} moved ${distance}m`);
}
}
class Dog extends Animal {
bark(): void {
console.log(`${this.name} says: Woof!`);
}
}
const dog = new Dog("Buddy");
dog.move(10); // 继承父类方法
dog.bark(); // 自有方法
super 调用
子类构造函数必须先调用 super():
TypeScript
class Manager extends Employee {
private teamSize: number;
constructor(id: string, salary: number, department: string, teamSize: number) {
super(id, salary, department); // 必须先调用
this.teamSize = teamSize;
}
// 重写父类方法
getInfo(): string {
return `${super.getInfo()} Team size: ${this.teamSize}`;
}
}
方法重写
TypeScript
class Bird extends Animal {
constructor(name: string) {
super(name);
}
// 重写 move 方法
move(distance: number): void {
console.log(`${this.name} flew ${distance}m`);
}
}
要点总结
- 类用
class关键字定义,包含属性、方法、构造函数 - 构造函数参数前加
public/private/protected可自动创建属性(参数属性) private限制最严格,protected允许子类访问- 继承用
extends,子类构造函数必须先调用super() - 方法重写可直接覆盖父类同名方法,可用
super.method()调用父类版本
📝 发现内容有误?点击此处直接编辑