如何在 TypeScript 中实现继承?
题目里常有人口误写成“实现集成”,但在 TypeScript 语境下,通常考的是“继承(inheritance)与实现(implements)”。
面试速答(30 秒版 TL;DR)
- TypeScript 里的继承主要分三层:
class extends class:类继承类,复用实现;interface extends interface:接口继承接口,复用类型契约;class implements interface:类实现接口,满足结构约束,但不继承实现。
- 面试里要把
extends和implements区分清楚:extends更偏“继承已有能力”;implements更偏“承诺满足某个规范”。
心智模型:实现和继承不是一回事
1. 类继承类:extends
class Animal {
constructor(public name: string) {}
move() {
console.log(`${this.name} is moving`);
}
}
class Dog extends Animal {
bark() {
console.log("wang");
}
}
const dog = new Dog("Lucky");
dog.move();
dog.bark();
这里 Dog 会继承:
- 父类属性;
- 父类方法;
- 父类构造链能力。
2. 子类怎么改写父类行为
class Animal {
move() {
console.log("animal move");
}
}
class Bird extends Animal {
override move() {
console.log("bird fly");
}
}
这里建议面试时顺带提一句:
- TypeScript 4.3+ 支持
override; - 它能帮助你显式说明“我是在重写父类成员”,减少误写风险。
3. 子类构造函数和 super
class Animal {
constructor(public name: string) {}
}
class Dog extends Animal {
constructor(name: string, public age: number) {
super(name);
}
}
重点要点:
- 子类构造函数里如果用了
this,必须先super(...); super用来调用父类构造函数或父类方法。
4. 接口继承接口
interface Animal {
name: string;
}
interface Dog extends Animal {
bark(): void;
}
这类继承不涉及运行时代码,只是类型层面的契约扩展。
所以它和类继承类最大的区别是:
- 不复用实现;
- 只复用结构定义。
5. 类实现接口:implements
interface Runner {
run(): void;
}
class Player implements Runner {
run() {
console.log("running");
}
}
这个时候 Player 不是“继承了接口实现”,而是:
- 编译器检查
Player是否满足Runner契约。
很多人把 implements 误答成“继承接口”,这是常见扣分点。
6. extends 和 implements 怎么区分
| 关键字 | 作用 | 是否继承实现 | 典型对象 |
|---|---|---|---|
extends | 继承 | 是,类继承类时会继承实现 | class、interface |
implements | 实现契约 | 否 | class implements interface |
补一句更完整:
interface extends interface是契约继承;class extends class是实现继承;class implements interface是契约实现。
7. TypeScript 继承相关的高频追问
7.1 TypeScript 支持多继承吗
类不支持多继承,只能单继承。
但接口支持多继承:
interface A {
a: string;
}
interface B {
b: number;
}
interface C extends A, B {
c: boolean;
}
7.2 如何替代类的多继承
常见思路:
- 组合(composition);
- mixin;
- 接口 + 组合对象。
工程里通常更推荐组合优于继承层级过深。
7.3 private / protected 在继承里有什么意义
private:只允许类内部访问;protected:类内部和子类可访问;public:默认公开。
这是面向对象封装和继承边界控制的基础。
8. 常见误区
- 误区 1:把
implements当成继承。- 它只是满足接口契约。
- 误区 2:以为接口继承会带来运行时逻辑。
- 接口只存在编译期。
- 误区 3:继承层级拉得过深。
- 真实工程里容易增加耦合和维护成本。
速记要点
class extends class复用实现。interface extends interface复用类型契约。class implements interface只做约束,不拿实现。