编程全栈开发工程师

如何在 TypeScript 中实现和类型化重载构造函数?为什么不能简单地指定多个 constructor 方法,以及如何正确实现这一点?

用 Hintsage AI 助手通过面试

答案。

TypeScript 不支持在一个类中有多个构造函数体的声明,这与许多面向对象编程语言不同。相反,可以声明多个构造函数的签名(重载),然后实现一个统一的构造函数体,在其中手动解析参数:

class User { name: string; age: number; constructor(name: string); constructor(name: string, age: number); constructor(name: string, age?: number) { this.name = name; this.age = age ?? 18; } } const u1 = new User('Alice'); // age = 18 const u2 = new User('Bob', 32); // age = 32

重要细节:

  • 在类中可以在实现之前指定多个签名,但仅允许一个构造函数的实现。
  • 构造函数的实现必须与所有重载选项兼容。
  • TypeScript 自行检查参数与重载的兼容性。

陷阱问题。

"可以这样实现构造函数吗?"

undefined

class Test { constructor(x: number) {} constructor(x: string) {} }


**正确答案:** 不,可以这样写会引发错误:"Duplicate constructor implementation"。在 TypeScript 中只允许一个构造函数体的实现,重载以签名形式呈现(没有体)。

### 由于不了解该主题的细节而导致的实际错误示例。

---
> 故事

在项目中尝试实现一个有两个不同参数的构造函数的类 — 复制了 Java 的经验。结果 TypeScript 抛出编译错误,项目无法编译,必须迅速重写为签名中的重载。

---
> 故事

团队中的一位成员编写了一个具有重载的类构造函数,但忘记考虑参数的可选性(未处理 undefined)。这导致尝试访问不存在的值并在使用最小参数集创建实例时崩溃。

---
> 故事

声明了构造函数的重载,但构造函数的体与描述的调用选项不匹配。在一种情况下,期望第二个参数是必需的,而在签名中它是可选的。这个冲突没有立即被发现,但在编写单元测试时浮现,并使调试变得困难。