我正在做一个Node JS TypeScript项目。我将首先向您介绍代码,因为它对我来说更容易解释。
我有一个班如下
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);
我该怎么做呢?或者有没有其他的方法可以替代我所要实现的?基本上我不希望客户端创建类的示例。我宁愿在validateRequest
函数中创建示例。客户端仍然应该知道RequestValidator
的契约。
2条答案
按热度按时间ryhaxcpt1#
该(有点不方便命名)文档部分Abstract Construct Signatures恰恰展示了这个用例。您可以使用构造签名来生成从
RequestValidator
派生的类的示例(即new () => RequestValidator
)。这将允许您将LoginFormValidator
传递给validateRequest
并在那里示例化它。它还将正确地禁止传递抽象类。TypeScript playground
正如我提到的,文档有点混乱,因为正如jcalz指出的那样,它使用的是常规的构造签名而不是抽象的构造签名。如果使用抽象的构造签名,它将是
(validatorClass: abstract new () => RequestValidator) => ..
,这正是我们在这里不想要的。vc9ivgsu2#
在TypeScript中,您不能直接创建抽象类的示例,因为抽象类旨在作为其他类的基类进行扩展,并且不能自己示例化。但是,您可以使用扩展抽象类的派生类创建抽象类的typeof Class变量的示例。