我想将 Express.js 与 Typescript 一起使用来指定代码更加模块化/面向对象。
我想通过实现 IRoute 接口然后将新的 Route 添加到 app.use() 来实现 Route/Controller。
我面临的问题是每个操作(get、post、put、delete)本身都会返回 IRoute 接口,我不确定要返回什么。回来
return <IRoute> this;
在操作中不起作用。
打字稿编译器响应以下错误消息:
MessurmentsController 类错误地实现了 IRoute 接口。
的财产类型不兼容。类型all
不可分配给(req: Request, res: Response, next: Function) => void
。参数type (...handler: RequestHandler[]): IRoute
和req
的类型不兼容。类型handler
不可分配给类型Request
。RequestHandler
/// <reference path="../../../typings/tsd.d.ts" />
import {IRoute, Request,Response} from 'express';
export class MeasurementsController implements IRoute {
path: string;
stack: any;
constructor(){
this.path = "/api/measurements"
}
all(req: Request, res: Response, next: Function){
res.send('');
//return <IRoute> this;
}
get(req: Request, res: Response, next: Function){
res.send('');
}
post(req: Request, res: Response, next: Function){
res.send('');
}
put(req: Request, res: Response, next: Function){
res.send('');
}
delete(req: Request, res: Response, next: Function){
res.send('');
}
patch(req: Request, res: Response, next: Function){
res.send('');
}
options(req: Request, res: Response, next: Function){
res.send('');
}
head(req: Request, res: Response, next: Function){
res.send('');
}
}
d.ts 中的 Route 定义为
module e {
interface IRoute {
path: string;
stack: any;
all(...handler: RequestHandler[]): IRoute;
get(...handler: RequestHandler[]): IRoute;
post(...handler: RequestHandler[]): IRoute;
put(...handler: RequestHandler[]): IRoute;
delete(...handler: RequestHandler[]): IRoute;
patch(...handler: RequestHandler[]): IRoute;
options(...handler: RequestHandler[]): IRoute;
head(...handler: RequestHandler[]): IRoute;
}
知道我需要在操作中返回什么才能使其正常工作吗?
终于出现了解决方案:
路由控制器 允许使用方法创建控制器类作为处理请求的操作。您可以将路由控制器与express.js 或koa.js 一起使用。 https://github.com/pleerock/routing-controllers
希望这对您有帮助。
export class Admin implements IRoute {
path: string;
stack: any;
constructor() {
this.path = '/api/Admin';
}
all(handerl: RequestHandler): any {
return <IRoute>this;
}
get(handerl: RequestHandler): any {
return <IRoute>this;
}
post(handerl: RequestHandler): any {
return <IRoute>this;
}
put(handerl: RequestHandler): any {
return <IRoute>this;
}
delete(handerl: RequestHandler): any {
return <IRoute>this;
}
patch(handerl: RequestHandler): any {
return <IRoute>this;
}
options(handerl: RequestHandler): any {
return <IRoute>this;
}
head(handerl: RequestHandler): any {
return <IRoute>this;
}
}
这个问题让我很恼火,所以在我的上一个项目中,我最终编写了自己的打字稿包装器,后来我将其提取到独立库中。
您可以查看我的类型安全打字稿路由器包装器:express-typed。
express 类型的实现正是这个问题所要求的:类型安全的 Express 路由器。
实现问题中提供的演示很简单
import { TypedRequest, TypedResponse, TypedRouter, ParseRoutes, GetRouteResponseInfo } from "express-typed";
const typedRouter = new TypedRouter({
// returned type is inferred
"/api/Admin": {
get: (req, res) => {
return res.send("get: /api/Admin").status(200);
},
}
});
export default typedRouter;
export type AppRoutes = ParseRoutes<typeof typedRouter>;
// getting the type is simple as:
type ApiAdminResponse = GetRouteResponseInfo<AppRoutes, "/api/Admin", "get">;
// ^? type ApiAdminResponse = "get: /api/Admin"
在存储库中阅读更多内容。