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
重要细节:
"可以这样实现构造函数吗?"
undefined
class Test { constructor(x: number) {} constructor(x: string) {} }
**正确答案:** 不,可以这样写会引发错误:"Duplicate constructor implementation"。在 TypeScript 中只允许一个构造函数体的实现,重载以签名形式呈现(没有体)。
### 由于不了解该主题的细节而导致的实际错误示例。
---
> 故事
在项目中尝试实现一个有两个不同参数的构造函数的类 — 复制了 Java 的经验。结果 TypeScript 抛出编译错误,项目无法编译,必须迅速重写为签名中的重载。
---
> 故事
团队中的一位成员编写了一个具有重载的类构造函数,但忘记考虑参数的可选性(未处理 undefined)。这导致尝试访问不存在的值并在使用最小参数集创建实例时崩溃。
---
> 故事
声明了构造函数的重载,但构造函数的体与描述的调用选项不匹配。在一种情况下,期望第二个参数是必需的,而在签名中它是可选的。这个冲突没有立即被发现,但在编写单元测试时浮现,并使调试变得困难。