TypeScript 抽象类怎么用

在前端开发里,你是不是常遇到这种情况:写一个通用的基础代码,却不想让别人直接用这个基础代码去实例化,只能让别人基于它来扩展自己的功能?比如做一个电商系统,所有商品都有“名称”“价格”这些基础属性,但不同类型的商品(比如实物商品、虚拟商品、服务类商品)的“计算运费”“交付方式”完全不一样,你肯定不想让同事随便new一个基础的“商品类”,因为根本不知道该怎么处理后续的交付。这时候TypeScript里的“抽象类”就能帮你解决这个问题。

什么是抽象类?先从“不能直接用的模板”理解

你可以把抽象类想象成“装修前的户型图草稿”:它画好了所有房间的基础框架(比如承重墙、水管预留位),但不会直接变成能住的房子,因为具体怎么装修(比如客厅铺地板还是瓷砖、卧室做衣柜还是榻榻米)得由你自己来定。

TypeScript 抽象类怎么用

对应到代码里,抽象类是专门用来被继承的类,它有两个核心特点:一是不能直接通过new来创建实例,必须让子类继承它;二是它既可以有“已经实现好的方法”(比如户型图里固定的承重墙位置),也可以有“只写了名字、没写具体内容的方法”(比如“客厅装修方案”,只说要做什么,不说怎么做)——这种没实现的方法,就叫“抽象方法”,只有抽象类里才能定义抽象方法。

举个生活化的例子:我们先定义一个“外卖订单”的抽象类,所有外卖订单都有“下单时间”“收货人”这些固定信息,但“计算配送时长”的方法,不同订单不一样:奶茶店出餐快,配送时长就短;火锅要等很久,配送时长就长。

怎么用抽象类?两步搞定(附简单代码)

用抽象类其实很简单,分两步:先写抽象类,再让子类继承它,补全抽象方法的内容。

第一步:定义抽象类,用abstract关键字标记

还是用外卖订单的例子,我们来写代码:

`typescript

// 定义抽象类,用abstract开头

abstract class TakeoutOrder {

// 已经实现好的公共属性,所有子类都能直接用

orderTime: Date;

receiver: string;

constructor(orderTime: Date, receiver: string) {

this.orderTime = orderTime;

this.receiver = receiver;

}

// 已经实现好的公共方法,所有子类共用逻辑

printBaseInfo() {

console.log(【订单基础信息】收货人:${this.receiver},下单时间:${this.orderTime.toLocaleString()});

}

// 抽象方法:只写方法名和参数,没有具体实现,用abstract标记

abstract calculateDeliveryTime(): number;

}

`

这里要注意两个点:第一,类名前加了abstract,说明这是抽象类,不能直接new TakeoutOrder(),要是这么写,TypeScript会直接报错;第二,calculateDeliveryTime方法前也加了abstract,说明是抽象方法,必须让子类来实现具体逻辑。

第二步:子类继承抽象类,补全抽象方法

现在我们做奶茶订单和火锅订单两个子类,继承上面的抽象类,把抽象方法的内容填上:

`typescript

// 奶茶订单子类,继承TakeoutOrder

class MilkTeaOrder extends TakeoutOrder {

// 必须实现父类的抽象方法,不然也会报错

calculateDeliveryTime(): number {

// 奶茶出餐快,算20分钟

return 20;

}

}

// 火锅订单子类,继承TakeoutOrder

class HotpotOrder extends TakeoutOrder {

calculateDeliveryTime(): number {

// 火锅出餐慢,算45分钟

return 45;

}

}

`

这时候你就可以用子类来创建实例了:

`typescript

// 正确:用子类创建实例

const myMilkTea = new MilkTeaOrder(new Date(), "小明");

myMilkTea.printBaseInfo(); // 输出【订单基础信息】收货人:小明,下单时间:...

console.log(奶茶配送时长:${myMilkTea.calculateDeliveryTime()}分钟); // 输出20

const myHotpot = new HotpotOrder(new Date(), "小红");

myHotpot.printBaseInfo(); // 输出对应的基础信息

console.log(火锅配送时长:${myHotpot.calculateDeliveryTime()}分钟); // 输出45

`

要是你忘了实现抽象方法,比如给MilkTeaOrder删掉calculateDeliveryTime,TypeScript会立刻提示你“子类没有实现父类的抽象方法”,帮你提前避免bug。

抽象类的核心好处:统一规范,减少出错

很多新手会问:“我不用抽象类,直接写普通的父类不行吗?”其实区别很大:普通父类可以被随意实例化,要是有人不小心new TakeoutOrder(),就会因为calculateDeliveryTime没写内容而出错;而抽象类从语法上就禁止了直接实例化,只能按要求继承子类,保证了所有子类都遵守“有固定属性+有自定义计算配送时长方法”的规范,团队协作时没人会写错基础逻辑。

简单总结下:当你需要给一组相关子类定好统一的基础框架,又不想让别人直接用基础框架创建对象时,就用TypeScript的抽象类。它就像团队里的“规范模板”,既统一了大家的基础代码,又给每个人留了自定义功能的空间。

上一篇 Swift语言核心特性与日常开发中的实用技巧科普