将类函数作为回调传递并在typescript中设置

将类函数作为回调传递并在typescript中设置,typescript,Typescript,在我的express应用程序中,我的控制器看起来像: import * as express from 'express'; import { BooksService } from '../services'; export class BooksController { constructor (private booksService: BooksService) { } register(router: express.Router) { //LINE IN QUE

在我的express应用程序中,我的控制器看起来像:

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);
router.get('/', getBooks(this.booksService));
…但当然,这将是未定义的

我还可以使getBooks成为类外的无状态函数:

function getBooks(booksService: BooksService) {
  return function(req: express.Request, rsp: express.Response, next: express.NextFunction) {
    rsp.json(booksService.getAllBooks());
  };
}
这让我可以将这一行改写为:

router.get('/', this.getBooks);
router.get('/', getBooks(this.booksService));
…但这仍然是一个冗长的样板文件,特别是当getBooks需要访问多个实例变量时

是否有任何方法可以将this.getBooks作为回调传递给express,以便在调用它时定义它?我觉得我缺少了一些简单的东西。

您可以将getBooks定义为一个类型为函数的字段,并为其分配一个箭头函数,从而获得正确的结果,如下所示:


这确实会对性能产生一些影响,因为函数将在构造函数中创建,但如果您只是在每次调用时创建一个箭头函数,那么情况会更糟。

This.getBooks.bindthis?这是JS绑定行为,与TS无关。这同样有效。谢谢,太好了。谢谢我会在可能的时候接受答案。