Узел + Экспресс-маршрутизатор + Тип Сценарий: строковый аргумент не может быть назначен типу requesthandlerparams - PullRequest
0 голосов
/ 14 сентября 2018

Я слежу за tuto, чтобы создать полноценный API для отдыха, затем я создаю класс TS, который экспортирует новый экспресс-маршрутизатор:

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;

Когда я хочу использовать этот новый маршрутизатор в моих приложениях следующим образом, я получаю ошибку TS, и сборка не удалась с сообщением:

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

Заявление об использовании:

    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, в моем случае, был не Маршрутизатором, как я ожидаю, а чем-то другим, но не знаю почему. Чего мне не хватает?

Привет

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Похоже, вы импортируете класс TourRouter вместо реального маршрутизатора, который является экспортом по умолчанию. Заменить import { TourRouter } from './routes/TourRouter'; на import TourRouter from './routes/TourRouter';. Вы можете импортировать маршрутизатор, используя имя, отличное от TourRouter, чтобы избежать путаницы.

TypeScript знает, что аргументы, которые вы передаете this.express.use, не соответствуют ни одной из допустимых сигнатур перегрузки, но он не знает, какую сигнатуру перегрузки вы намеревались использовать. Он (неправильно) угадывает сигнатуру (...handlers: RequestHandlerParams[]) => T, которая объясняет странную ошибку, что путь строки не может быть назначен RequestHandlerParams.

0 голосов
/ 14 сентября 2018

Для меня это, возможно, странная проблема с типом «Запрос», «Ответ», «Следующая функция». Можете ли вы попробовать просто импортировать * из экспресса и квалифицировать каждый тип экспрессом.

Запрос -> Экспресс. Запрос

https://github.com/DefinitelyTyped/DefinitelyTyped/issues/16639

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...