我正在创建一个处理快速路线的模块。我创建了一个程序,它从目录.
中的类调用方法。这个类的例子可以在这里看到。
class UsersController {
private ping(_: any, response: Response) {
response.status(200).send({ message: "Pong!" });
}
public get(): RouteDeclaration[] {
return [{ path: "/ping", method: "get", action: this.ping }];
}
}
我想知道是否有可能,例如用一些抽象类扩展类,这可以让我做一些像所有方法的通配符:
abstract class RouteController {
abstract get(): RouteDeclaration[];
abstract *(request: Request, response: Response, next: NextFunction): void; // like this!
}
是否有可能以某种方式通配符这些方法没有特定的名称毕竟?
我认为你可以用这样的索引签名来实现它:
type Method = (req: Request, res: Response, next: NextFunction) => void;
abstract class RouteController {
abstract get(): RouteDeclaration[];
[key: string]: Method;
}
class UserController extends RouteController {
private ping(_: any, response: Response) {
response.status(200).send({ message: "Pong!" });
}
get() {
return [{ path: "/ping", method: "get", action: this.ping }];
}
myMethod: Method = (req, res, next) => {
// implementation
};
otherMethod: Method = (req, res, next) => {
// implementation
};
// this will give a compiler error:
illegalMethod(v: number): string {
return "";
}
}
我期望编译器自动推断UserController
类中方法的参数和返回类型,但这似乎只适用于简单类型。这就是为什么最好将签名提取为Method
之类的东西并将其用于方法实现的原因。当然,你也可以让它们成为真正的方法,但是你必须为每个方法指定参数的类型和返回类型。
不可能。抽象方法应该有一个方法签名,这意味着要实现的方法有一个方法名。
我建议你创建一个通用的方法名,如execute
。