将类函数作为回调传递,并将其设置为typescript

时间:2018-04-11 15:55:27

标签: typescript

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

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?我觉得我错过了一些简单的事情。

1 个答案:

答案 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());
  }

}

这确实有一些性能影响,因为该函数将在构造函数中创建,但如果您只是想在每个调用上创建一个箭头函数,那么它应该更糟。