如何在Typescript中创建抽象类的typeof Class变量的示例

deyfvvtc  于 2023-04-13  发布在  TypeScript
关注(0)|答案(2)|浏览(167)

我正在做一个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的契约。

ryhaxcpt

ryhaxcpt1#

该(有点不方便命名)文档部分Abstract Construct Signatures恰恰展示了这个用例。您可以使用构造签名来生成从RequestValidator派生的类的示例(即new () => RequestValidator)。这将允许您将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) => ..,这正是我们在这里不想要的。

vc9ivgsu

vc9ivgsu2#

在TypeScript中,您不能直接创建抽象类的示例,因为抽象类旨在作为其他类的基类进行扩展,并且不能自己示例化。但是,您可以使用扩展抽象类的派生类创建抽象类的typeof Class变量的示例。

abstract class Animal { abstract makeSound(): void; }
class Dog extends Animal { makeSound(): void { console.log("Woof"); } }
const AnimalClass: typeof Animal = Dog; const animalInstance = new AnimalClass();
animalInstance.makeSound(); // Output: "Woof"

相关问题