我正在做一个Node JS打字项目.我将首先向您介绍代码,因为这对我来说更容易解释.

我上的课如下所示

export abstract class RequestValidator {
  abstract getSchema(req: Request, res?: Response): joi.ObjectSchema;
}

然后我有一个具体的类,它扩展了上面的抽象类.

class LoginFormValidator extends RequestValidator {
  getSchema(req: Request, res?: Response): joi.ObjectSchema {
    return {
       email: joi.string().required(),
       password: joi.string().required()
    } as joi.ObjectSchema; // this is just dummy code
  }
}

我想要做的是,我希望将扩展为RequestValidator的类的类型传递给一个函数,并创建它的一个实例.

就像这样.

// this is purely a dummy code
const validateRequest = (validatorClass: typeof RequestValidator) => {
   // here I want to create an instance like this `new validatorClass`
}

正如您在上面的虚拟代码中所看到的,该注释暗示了我想要实现的目标.我会将LoginFormValidator传递给这样的函数.

validateRequest(LoginFormValidator);

我怎么能做到这一点?或者,除了我正在努力实现的目标之外,还有其他 Select 吗?基本上,我不希望客户端创建类的实例.我更愿意在validateRequest函数中创建实例.客户仍然应该知道RequestValidator的合同.

推荐答案

文档部分Abstract Construct Signatures(名称有些不太方便)正好显示了这个用例.您可以使用construct signature来生成从RequestValidator派生的类的实例(即new () => RequestValidator),而不是使用typeof RequestValidator作为validateRequest的参数类型.这将允许您将LoginFormValidator传递给validateRequest并在那里实例化它.它还将正确地禁止传递抽象类.

const validateRequest = (validatorClass: new () => RequestValidator) => {
  const requestValidator = new validatorClass()
  const test = requestValidator.getSchema({} as Request)
  // const test: joi.ObjectSchema<any>
}

validateRequest(LoginFormValidator); // Works.
validateRequest(RequestValidator); // Fails on the abstract class, as desired.

TypeScript playground

正如我提到的,文档有点令人困惑,因为正如jcalz指出的那样,它使用的是常规构造签名,而不是抽象构造签名.对于抽象构造签名,它将是(validatorClass: abstract new () => RequestValidator) => ..,这正是我们在这里不想要的.

Typescript相关问答推荐

如何将http上下文附加到angular中翻译模块发送的请求

类型是工作.但它失go 了正确变体的亮点..为什么?或者如何增强?

VS代码1.88.0中未出现自动导入建议

我用相同的Redux—Toolkit查询同时呈现两个不同的组件,但使用不同的参数

如何根据另一个属性的布尔值来缩小函数属性的返回类型?

使用ngrok解析Angular 时出现HTTP故障

<;T扩展布尔值>;

对未到达受保护路由的路由环境做出react

在Typescript 中,有没有`index=unfined的速记?未定义:某个数组[索引]`?

为什么我的动画状态在组件实例之间共享?

如何从输入中删除值0

为什么&Quot;元素隐式具有';Any';类型,因为...即使我已经打字了,也不能作为索引显示错误吗?

ANGLE NumberValueAccessor表单控件值更改订阅两次

如何避免从引用<;字符串&>到引用<;字符串|未定义&>;的不安全赋值?

抽象类对派生类强制不同的构造函数签名

如何从接口中省略接口

如何在本地存储中声明该类型?

如何在Deno中获取Base64图像的宽/高?

TypeScript中的这些条件类型映射方法之间有什么区别?

如何从 Select 元素中删除选项