我正在跟随一个tuto创建一个完整的rest api,然后,我创建一个TS类,该类导出一个新的express路由器:

import { Router, Request, Response, NextFunction } from 'express';


export class TourRouter {
public router: Router;

constructor() {
    this.router = Router();

    this.init();
}

public init(): void {
    this.router.get(
        '/',
        this.getTours
    );
}

private getTours(request: Request, response: Response, next: NextFunction) {
    // Some JSON
    const tours = {
        "now": "2018-09-09 18:40:00",
        "date": "2018-09-09",
        "tours": [
            {
                "time": "8",
                "places": 8,
                "isPast": false
            },
            {
                "time": "11",
                "places": 8,
                "isPast": false
            },
            {
                "time": "14",
                "places": 8,
                "isPast": false
            },
            {
                "time": "17",
                "places": 8,
                "isPast": false
            }
        ]
    };

    response.send(tours);
}
}

const tourRoutes = new TourRouter();
tourRoutes.init();

export default tourRoutes.router;


当我想按以下方式在App.ts中使用此新路由器时,出现TS错误,并且构建失败并显示以下消息:

Argument of type 'string' is not assignable to parameter of type 'RequestHandlerParams'


use语句为:

    private _routes(): void {
    let router = express.Router();

    router.get('/', (request, response, next) => {
        response.json({
            message: 'Hello World'
        });
    });

    this.express.use('/', router);
    this.express.use('/api/v1/tours', TourRouter);
}


仿佛TourRouter,在我的情况下不是我所期望的路由器,而是其他东西,但不知道为什么。我想念什么?

问候

最佳答案

听起来您正在导入TourRouter类,而不是实际的路由器,这是默认的导出。将import { TourRouter } from './routes/TourRouter';替换为import TourRouter from './routes/TourRouter';。您可能要使用TourRouter以外的名称导入路由器,以免造成混淆。

TypeScript知道您要传递给this.express.use的参数与任何有效的重载签名都不匹配,但是它不知道您打算使用哪个重载签名。它(错误地)猜测(...handlers: RequestHandlerParams[]) => T签名,这解释了一个奇怪的错误,即字符串路径不可分配给RequestHandlerParams

10-08 04:32