在TypeScript中,我使用类似Java的类型Class:

interface Class<T = void> {

    new(...args: any[]): T;

}

但是,这种类型不适用于抽象类:

abstract class Bar {}

class Foo {
   
  test(clazz: Class) { }

  doIt() {
    this.test(Bar);//ERROR
  }
}

我得到的误差是Argument of type 'typeof Bar' is not assignable to parameter of type 'Class<void>'.如果类栏不是抽象的,那么一切都正常.

我理解,问题是我们说可以使用new运算符,但不能对抽象类使用这个运算符.然而,我需要一个类型,它可以同时适用于非抽象类和抽象类(抽象类也是类).如果可能的话,有人能说怎么做吗?

推荐答案

您可以使用abstract construct signature:

type Class<T = void> =
  abstract new (...args: any[]) => T;

您可以根据需要为此类签名指定常规/具体构造函数和abstract构造函数:

abstract class Bar { }
class Baz { }

class Foo {

  test(clazz: Class) { }

  doIt() {
    this.test(Bar); // okay
    this.test(Baz); // okay
  }
}

请注意,无论出于何种原因,abstract个构造签名必须是箭头构造表达式的形式(如function expression);在构造签名这样的对象中,不能将abstract放在new之前:

interface Oops<T = void> {
  abstract new(...args: any[]): T; // error!
  //~~~~~~ <-- 'abstract' modifier cannot appear on a type member
}

Playground link to code

Typescript相关问答推荐

React router 6.22.3不只是在生产模式下显示,为什么?

react 路由6操作未订阅从react 挂钩表单提交+也不使用RTK查询Mutations

如何在TypeScrip中使用嵌套对象中的类型映射?

来自类型脚本中可选对象的关联联合类型

是否可以基于对象的S属性值[]约束对象的其他属性值用于类型化的对象数组?

路由链接始终返回到

在类型脚本中创建泛型类型以动态追加属性后缀

转换器不需要的类型交集

如何过滤文字中的类对象联合类型?

如何缩小函数的返回类型?

在类型脚本中将泛型字符串数组转换为字符串字母并集

如何在脚本中输入具有不同数量的泛型类型变量的函数?

如何在Angular 服务中制作同步方法?

回调函数中的TypeScrip类型保护返回Incorect类型保护(具有其他未定义类型的返回保护类型)

如何使用TypeScrip在EXPO路由链路组件中使用动态路由?

打字错误TS2305:模块常量没有导出的成员

如何在Reaction Native中关注屏幕时正确更新状态变量?

如何提取具有索引签名的类型中定义的键

Angular另一个组件的nativeelement未定义

类型string不可分配给类型string| 联盟| 的'