node.js - 如何在 Typescript 中表示抽象类的任何子类的类型?

标签 node.js typescript oop inheritance abstract-class

假设

abstract class A {};
class B extends A {};
class C extends A {};

我想接受 A 的任何子类作为参数。

function foo(Subclass: A){
   const obj = new Subclass();
}

这行不通。我收到错误

This expression is not constructable. Type 'BaseController' has no construct signatures.

然后我尝试了

function foo(Subclass: typeof A){   
   const obj = new Subclass();
}

现在我收到错误

Cannot create an instance of an abstract class.ts(2511)

因为它假设我传递的是 A 而不是 A 的子类。

可以实现吗?我该如何让它发挥作用?

最佳答案

我认为你应该将注释更改为以下内容:

function foo(subclass: new () => A) {
  const obj = new subclass();
}

在这里,我们说子类newable (即,它是使用 new 运算符调用的构造函数),不带任何参数,并构造一个类型可分配给 A 的值。这应该接受 A 的任何具体子类,只要它有一个无参数构造函数:

foo(B); // okay
foo(C); // okay

它不会接受A本身,因为抽象类构造函数不被视为new能够:

foo(A); // error, A is abstract
<小时/>

哦,作为为 Stack Overflow 问题制作示例 TypeScript 代码的人的注释:请注意,TypeScript 的类型系统是 structural 。根据您提供的示例定义,ABC 的实例被视为相同,empty类型。和all objects are assignable to the empty type ,所以这也有效:

foo(Date); // okay also

为了防止这种情况,您应该向 AB 和/或 C 添加属性,以在结构上区分它们,例如:

abstract class A {
  a = "A"
};
class B extends A {
  b = "B"
};
class C extends A {
  c = "C"
};

这将导致更多预期的行为:

foo(B); // okay
foo(C); // okay
foo(A); // error, A is abstract
foo(Date); // error, 'a' is missing
<小时/>

好的,希望有帮助;祝你好运!

Playground link to code

关于node.js - 如何在 Typescript 中表示抽象类的任何子类的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60105917/

相关文章:

javascript - Node 是否在所需模块中运行所有代码?

typescript - 下一个 js 中的 Rust wasm

javascript - Typescript:将对象属性标记为不可枚举?

java - 有没有办法确定Java类中的方法是否已被覆盖

java - 当文本和变量同时使用 System.out.println 时出现错误

c++ - 包含不同大小静态数组的类的多个实例

node.js - Mongoose 中的 UpdateMany 不工作但直接在 mongodb 中工作正常

带有回调的 Node.js 函数不会异步运行

node.js - AWS lambda api 网关错误 "Malformed Lambda proxy response"

typescript - 如何使用 TypeORM 将项目添加到多对多关系表