Это мой код:
баннерКонтроллер:
class bannerController extends generalController {
constructor() {
super(BannerService);
}
}
export default new bannerController();
общийКонтроллер:
export default class generalController {
public service: any;
constructor(service: any) {
this.service = service;
}
public async status(req: Request, _res: Response, next: NextFunction): Promise<void>
{
console.info(this)
}
}
маршрутизатор:
router.patch(
'/banner/:id/status',
bannerController.status,
);
Эта строка console.info(this)
возвращается undefined
Если я изменю его на bannerController.status.bind(bannerController)
, все будет хорошо.
Но я не хочу использовать call, bind и...
есть декораторы машинописных текстов и другие пакеты, которые также помогают в этом, но они используют call
, bind
и apply
— npmjs.com/package/auto-bind
Не забудьте назвать свои классы, начинающиеся с заглавных букв. Это не имеет прямого отношения к вашей проблеме, но это было бы правильной практикой.
Альтернативным подходом было бы предоставление вашему классу метода, который возвращает функцию промежуточного программного обеспечения, как показано в следующем коде (Javascript, а не Typescript, извините):
class generalController {
...
statusMiddleware() {
return async function(req, _res, next) {
console.info(this);
}.bind(this);
}
}
router.patch(
'/banner/:id/status',
bannerController.statusMiddleware()
);
bind заставляет меня повторять bannerController
Итак, вы не возражаете против использования .bind(this)
, как в моем отредактированном ответе?
если вы хотите правильный
this
- тогда вы должны использоватьcall
,bind
илиapply
.