2

具体来说,我正在尝试为 express 设置服务器端打字稿编译。

公开的接口之一是 RequestHandler,具有以下结构:

// express-serve-static-core/index.d.ts

declare module "express-serve-static-core" {
  ...

  interface RequestHandler {
    (req: Request, res: Response, next: NextFunction): any;
  }
}

我写了以下课程:

import * as express from "express";

class PageNotFound implements express.RequestHandler {

  constructor (req: express.Request, res: express.Response, next: express.NextFunction) {
    let viewFilePath: string = "404";
    let statusCode: number = 404;
    let result: Object = {
      status: statusCode,
    };

    res.status(statusCode);
    res.render(viewFilePath, {}, function (err: Error, html: string): void {
      if (err) {
        res.status(statusCode).json(result);
      }
      res.send(html);
    });
  }
}

但是,这会引发错误:

error TS2345: Argument of type 'typeof PageNotFound' is not assignable to parameter of type 'RequestHandler'. Type 'typeof PageNotFound' provides no match for the signature '(req: Request, res: Response, next: NextFunction): any'

有什么建议吗?我不确定我做错了什么。

4

2 回答 2

2

RequestHandler 是一个接口,它指定了带有调用签名的东西,类无法实现。您想要一个常规功能:

function pageNotFound(req: express.Request, res: express.Response, next: express.NextFunction) {
    ...
}

如果接口new在方法签名之前,它将定义类的构造函数的形状,但事实并非如此。

另一种思考方式是:当你使用一个类时,你定义了一个必须用new. Express 会调用“new PageNotFound(...)”还是调用“pageNotFound(...)”?

正如 TypeScript 开发人员之一 Ryan Cavanaugh所说:

更正式地说,实现接口的类是类实例所具有的合同... – Ryan Cavanaugh 2012-11-15 23:57

于 2016-04-22T16:39:51.393 回答
0

您想保持简单,类用于多次使用的对象。该模块express为您提供具有正确属性的路由器对象。

import * as express from 'express';
const router = express.Router();

router.get('/', (req: express.Request, res: express.Response, next: express.NextFunction) => {
    res.render('index', {
        title: 'Express'
    })
});

export = router; 
于 2016-09-04T02:48:48.490 回答