在我的快递应用程序中,我的控制器看起来像:
import * as express from 'express';
import { BooksService } from '../services';
export class BooksController {
constructor (private booksService: BooksService) { }
register(router: express.Router) {
//LINE IN QUESTION
router.get('/', (req, rsp, next) => this.getBooks(req, rsp, next));
}
private getBooks(req: express.Request, rsp: express.Response, next: express.NextFunction) {
rsp.json(this.booksService.getAllBooks());
}
}
但是,我真的想把问题写成:
router.get('/', this.getBooks);
...但当然this
将是未定义的。
我也可以让getBooks
成为课外的无状态函数:
function getBooks(booksService: BooksService) {
return function(req: express.Request, rsp: express.Response, next: express.NextFunction) {
rsp.json(booksService.getAllBooks());
};
}
这允许我将相关的行重写为:
router.get('/', getBooks(this.booksService));
...但这仍然是一个繁琐的样板,特别是如果getBooks
需要访问多个实例变量。
有没有什么方法可以将this.getBooks
作为回调表达,以便在调用时定义this
?我觉得我错过了一些简单的事情。
答案 0 :(得分:1)
您可以将getBooks
定义为类型函数的字段,并为其指定一个箭头函数,从而捕获正确的this
:
export class BooksController {
constructor (private booksService: BooksService) { }
register(router: express.Router) {
router.get('/', this.getBooks);
}
private getBooks = (req: express.Request, rsp: express.Response, next: express.NextFunction) => {
rsp.json(this.booksService.getAllBooks());
}
}
这确实有一些性能影响,因为该函数将在构造函数中创建,但如果您只是想在每个调用上创建一个箭头函数,那么它应该更糟。