node.js - Node + Express router + TypeScript: el argumento de tipo string no se puede asignar al tipo requesthandlerparams
Estoy siguiendo un tutorial para crear una API REST completa, luego, creo una clase TS que exporta un nuevo enrutador de 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;
Cuando quiero usar este nuevo enrutador en mi App.ts de la siguiente manera, estoy obteniendo un error de TS y la compilación falló con el mensaje:
Argument of type 'string' is not assignable to parameter of type 'RequestHandlerParams'
La declaración use es:
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);
}
Como si TourRouter, en mi caso, no fuera un enrutador como esperaba, sino otra cosa, pero no sé por qué. ¿Qué me estoy perdiendo?
Saludos
Respuesta #1
Parece que estás importando la clase TourRouter en lugar del enrutador real, que es la exportación por defecto. Sustituye import { TourRouter } from './routes/TourRouter'; por import TourRouter from './routes/TourRouter';. Puede que desees importar el enrutador usando un nombre distinto a TourRouter para evitar confusiones.
TypeScript sabe que los argumentos que estás pasando a this.express.use no coinciden con ninguna de las firmas de sobrecarga válidas, pero no sabe qué firma de sobrecarga pretendías usar. (Incorrectamente) adivina la firma (...handlers: RequestHandlerParams[]) => T, lo que explica el extraño error de que la ruta de tipo string no se puede asignar a RequestHandlerParams.
Respuesta #2
Para mí, quizás sea un problema extraño con el tipo "Request" "Response" "NextFunction". ¿Puedes intentar simplemente importar * desde express y calificar cada tipo con express. ?
Solicitud --> express.Request
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/16639