跳到主要内容

如何在 TypeScript 中实现继承?

题目里常有人口误写成“实现集成”,但在 TypeScript 语境下,通常考的是“继承(inheritance)与实现(implements)”。

面试速答(30 秒版 TL;DR)

  • TypeScript 里的继承主要分三层:
    • class extends class:类继承类,复用实现;
    • interface extends interface:接口继承接口,复用类型契约;
    • class implements interface:类实现接口,满足结构约束,但不继承实现。
  • 面试里要把 extendsimplements 区分清楚:
    • 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. extendsimplements 怎么区分

关键字作用是否继承实现典型对象
extends继承是,类继承类时会继承实现classinterface
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 只做约束,不拿实现。