TypeScript 如何实现继承

你是不是写 JavaScript 代码时,常遇到“重复写一样的属性和方法”的麻烦?比如要写小狗、小猫两个类,都得加“名字”“年龄”,还都要有“吃饭”的方法——总不能复制粘贴吧?这时候“继承”就能帮你省好多事儿,而 TypeScript 里的继承用起来特别顺手,咱们用生活里养宠物的例子慢慢说。

什么是类和继承?先搞懂基础概念

先想个日常场景:你家有个“宠物”大概念,它有“名字”“年龄”,还会“吃饭”;后来你养了小狗,小狗除了宠物的属性,还多了“会汪汪叫”的本事;养了小猫,多了“会喵喵叫”的本事。

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就能轻松实现继承,子类拿父类的属性和方法,还能加新内容、改旧方法,帮你少写重复代码,写出来的代码更干净好维护。

上一篇 Java 如何升级