Typescript 抽象类

2025 年 4 月 28 日 | 阅读 5 分钟

TypeScript 是 JavaScript 的一个稍微强类型的超集,它为 JavaScript 添加了现代的面向对象编程语言特性。 它还支持称为抽象类的东西,这对于创建设计良好、可重用和可扩展的应用程序非常重要。 在本文中,我们将详细介绍 TypeScript 抽象类和抽象方法,它们是什么,它们如何工作以及何时使用它们。 我们将使用一些实际的例子,以便您对这个概念有一个清晰的理解。

什么是抽象类?

您可以将 TypeScript 中的抽象类视为本质上是抽象的类,不能直接实例化。 它是其他类的轮廓,派生类需要遵循特定的结构。

抽象类可以包含

  • 抽象方法:没有实现且必须由子类实现的方法。
  • 具体方法:这些是已实现的方法,子类可以调用或可以被覆盖。
  • 属性:抽象类还可以定义属性(有或没有值),就像其他类一样。

另一方面,抽象类的主要用途是为子类创建一个契约,以确保所有实现都相同。

抽象类的语法

下面是一个简单的例子

示例

输出

Roar
Moving...

关键点

  • Animal 类具有 abstract 关键字。
  • 它有一个抽象方法 makeSound(),没有它的主体。
  • Lion 是 Animal 的子类,满足 makeSound() 的契约。
  • 您不能直接创建 Animal 的实例。

抽象方法

抽象方法是在抽象类中声明但没有实现的声明。 除非子类也被声明为抽象的,否则它必须实现所有抽象方法。

示例

输出

78.53981633974483
I am a shape.

Shape 是一个抽象类,包含抽象方法 getArea() 和具体方法 describe() 告诉形状。

Square 类继承自 Shape 类,这意味着 Square 继承自 Shape。 构造函数在对象上创建一个 side 属性。

正方形的面积的公式是 边 x 边。 创建一个边长为 5 的 Square,然后 getArea() 方法计算正方形的面积,而从 Shape 继承的 describe() 方法打印 “我是一个形状”

抽象构造函数

当您想构建更复杂的工厂模式时,拥有抽象构造函数也很有帮助,TypeScript 通过接口和抽象类支持它。

示例

输出

Truck engine started

此模式通常用于依赖注入和工厂设计模式。

为什么使用抽象类?

现在,让我们学习一些抽象类更佳的原因和情况

1. 强制标准接口

抽象类要求子类符合一个联合 API。 因此,这在许多开发人员从事不同实现的大型应用程序中非常有帮助,这些实现应该相同。

2. 代码重用

抽象类允许您定义可以在多个子类之间共享的公共行为(具体方法或属性),从而帮助您消除重复代码。

3. 分层设计

它们帮助您在代码中定义逻辑抽象或层次结构,以实现更好的模块化和可维护性。

抽象类与接口

TypeScript 既有抽象类也有接口,它们可以用作强制执行的契约,但它们确实有一些区别

特性抽象类Interface
实施可以包含已实现的方法不能包含实现
实例化不能实例化不适用(没有实例)
属性/状态可以有字段和构造函数不能有状态或构造函数
可扩展性仅单继承可以实现多个接口
用例代码重用 + 契约强制纯契约强制

何时使用哪个?

当您真的只想定义数据形状或结构时,使用接口,而当您希望使用契约提供默认行为时,应该使用抽象类,因为通过使用抽象类,我们可以提供定义以及部分实现。

局限性

尽管它们很有用,但抽象类也有一些警告

  • 单继承:TypeScript 类只能扩展一个类,即使它是一个抽象类。
  • 无法强制执行多个行为:您不能使用抽象类同时强制执行多个契约,这与 接口不同。
  • 继承链会变得复杂:暴力的抽象类可能导致深度层次结构中的一些维护问题。
  • 无法实例化:抽象类不能被实例化,这将给出编译时错误。

最佳实践

要使抽象类在 TypeScript 中为您工作,请执行此操作

  • 保持抽象最小化:不要使用抽象类来实现太多的逻辑。 保持专注。
  • 使用接口进行多个契约:如果希望一个类适合多个不相关的契约,则应首选接口。
  • 记录抽象方法:为抽象方法提供含义和期望。
  • 优先组合而不是继承:坚持类继承可能矫枉过正。 在适当的时候考虑组合。
  • 避免深度继承树:尽可能地扁平化您的类层次结构,以使代码库可维护。

结论

TypeScript 中的抽象类是任何开发人员在使用面向对象设计时可以添加到工具包中的一个强大功能。 它们强制执行兼容的 API,促进代码重用并提供构建复杂应用程序的结构化方法。 学习抽象类可以帮助您设计既灵活又强大的优秀系统。 您可能会发现抽象类对 UI 库、数据模型或应用程序架构很有用。


下一个主题TypeScript vs. ES6