TypeScript 如何实现继承
你是不是写 JavaScript 代码时,常遇到“重复写一样的属性和方法”的麻烦?比如要写小狗、小猫两个类,都得加“名字”“年龄”,还都要有“吃饭”的方法——总不能复制粘贴吧?这时候“继承”就能帮你省好多事儿,而 TypeScript 里的继承用起来特别顺手,咱们用生活里养宠物的例子慢慢说。
什么是类和继承?先搞懂基础概念
先想个日常场景:你家有个“宠物”大概念,它有“名字”“年龄”,还会“吃饭”;后来你养了小狗,小狗除了宠物的属性,还多了“会汪汪叫”的本事;养了小猫,多了“会喵喵叫”的本事。

在代码里,“宠物”就是父类(也叫基类),小狗、小猫就是子类(也叫派生类)。继承就是子类“接过”父类的属性和方法,不用再从头写一遍,还能加自己的新东西——这就是 TypeScript 实现继承的核心,简单说就是“站在巨人的肩膀上写代码”。
TypeScript 实现继承的核心语法:extends 关键字
TypeScript 用 extends 关键字就能轻松让子类继承父类,举个具体例子你就懂了:
`typescript
// 先写父类:所有宠物的公共部分
class Pet {
// 公共属性:名字、年龄
name: string;
age: number;
// 父类的构造方法:创建宠物时赋值名字和年龄
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// 公共方法:所有宠物都要吃饭
eat() {
console.log(${this.name}正在乖乖吃饭~);
}
}
// 子类小狗,继承自 Pet
class Dog extends Pet {
// 子类新增的方法:小狗会汪汪叫
bark() {
console.log(${this.name}汪!汪!);
}
}
// 子类小猫,继承自 Pet
class Cat extends Pet {
// 子类新增的方法:小猫会喵喵叫
meow() {
console.log(${this.name}喵~喵~);
}
}
`
用的时候太简单了,直接创建子类实例就行:
`typescript
// 创建小狗实例,自动继承了Pet的name、age和eat方法
const myDog = new Dog("旺财", 3);
myDog.eat(); // 输出:旺财正在乖乖吃饭~
myDog.bark(); // 输出:旺财汪!汪!
// 创建小猫实例,同样继承了父类的东西
const myCat = new Cat("咪咪", 2);
myCat.eat(); // 输出:咪咪正在乖乖吃饭~
myCat.meow(); // 输出:咪咪喵~喵~
`
你看,子类根本不用写name、age属性和eat方法,extends自动帮你“抄”过来,完全没重复代码。
子类扩展父类:加自己的属性和方法
刚才的例子里,子类只加了方法,其实也能加属性。比如养的小狗是“金毛”,得加个breed(品种)属性,改一下Dog类就行:
`typescript
class Dog extends Pet {
breed: string; // 子类新增品种属性
constructor(name: string, age: number, breed: string) {
// 这里要注意:子类创建实例时,得先调用父类的构造方法,给父类的属性赋值
super(name, age);
this.breed = breed;
}
bark() {
console.log(${this.name}(${this.breed})汪!汪!);
}
}
`
这里的super是关键:子类的构造方法里,必须先调用super(),才能用this,因为父类的属性得先初始化好,就像你给小狗办户口,得先继承爸妈的户口信息(super),才能填自己的品种信息。
进阶:子类修改父类的方法(重写)
有时候父类的方法不太适合子类,比如宠物“吃饭”的样子,小狗和小猫不一样——这时候子类可以“重写”父类的方法:
`typescript
class Dog extends Pet {
// 重写父类的eat方法
eat() {
console.log(${this.name}叼着饭碗,狼吞虎咽~);
}
}
class Cat extends Pet {
// 重写父类的eat方法
eat() {
console.log(${this.name}小口小口舔着碗边吃饭~);
}
}
`
用的时候,调用eat就会自动用子类的版本,比如myDog.eat()会输出小狗吃饭的样子,myCat.eat()输出小猫的,符合实际场景。
注意:继承不是万能的,别用太复杂
虽然继承省代码,但也别滥用。比如要是你要写“鱼”,鱼也会“游泳”,总不能让鱼也继承Pet吧?因为鱼不会像猫狗那样“叫”,这时候用“接口”或者“组合”会更灵活——不过这是进阶内容,先把继承的基础用好就够了。
简单总结:TypeScript 用extends就能轻松实现继承,子类拿父类的属性和方法,还能加新内容、改旧方法,帮你少写重复代码,写出来的代码更干净好维护。