【问题标题】:Typescript polymorphism of constructor构造函数的打字稿多态性
【发布时间】:2021-02-02 07:45:46
【问题描述】:

假设我们有这个非常简单的类架构:

class Vehicle {}

class Car extends Vehicle {
    wheels: Number

    constructor(wheels: Number) {
        super()
        this.wheels = wheels
    }
}

我想要实现在变量中存储扩展车辆的构造函数类型,如下所示:

let vehicleConstructor: typeof Vehicle = Car  // this do not work

然后编译器抱怨Car 不能分配给类型typeof Vehicle。我可以理解为什么:这是因为两个类的构造函数没有相同的签名。要创建汽车,wheels 参数是必需的,而 Vehicle 不需要参数。

我在代码中真正想要的是拥有一组 Vehicle 构造函数:

let constructors: Array<typeof Vehicle> = [Car, Truck]

这样我就可以检查一个随机对象是否是数组中某个元素的实例。

我不会使用这个数组来创建车辆,所以我不关心构造函数的参数。我只需要确保我有一个函数数组或类构造函数返回Vehicle,无论参数如何。

知道如何实现这一目标吗?只有在 Typescript 中才有可能吗?

【问题讨论】:

  • 对我来说,您的 let vehicleConstructor2: typeof Vehicle = Car 工作正常,没有任何抱怨。
  • 提供一个完整的例子。它应该可以工作,返回值是协变的,如果你有不同的参数,那么它可能不起作用,但然后使用自定义 ctor 签名new () =&gt;Vehicletypescriptlang.org/play?noImplicitReturns=false#code/…
  • 在我的机器上工作。
  • 确实,我把问题分解得太多了——直到它真正起作用。我遇到了一个问题,因为在我的代码中构造函数没有相同的签名。我正在更新问题。

标签: typescript inheritance constructor polymorphism


【解决方案1】:

好的,感谢 Titian Cernicova-Dragomir 的提示,我找到了答案。

我需要做的是:

let vehicleConstructor: (new(...args: any) => Vehicle) = Car

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2018-04-08
    • 2021-12-31
    • 2018-06-26
    相关资源
    最近更新 更多