Express.js 使用 Typescript 进行路由

问题描述 投票:0回答:3

我想将 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;
        }

知道我需要在操作中返回什么才能使其正常工作吗?

node.js express typescript typescript1.6
3个回答
5
投票

终于出现了解决方案:

路由控制器 允许使用方法创建控制器类作为处理请求的操作。您可以将路由控制器与express.js 或koa.js 一起使用。 https://github.com/pleerock/routing-controllers


2
投票

希望这对您有帮助。

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;
    }
}

0
投票

这个问题让我很恼火,所以在我的上一个项目中,我最终编写了自己的打字稿包装器,后来我将其提取到独立库中。

您可以查看我的类型安全打字稿路由器包装器: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"

在存储库中阅读更多内容。

© www.soinside.com 2019 - 2024. All rights reserved.