【问题标题】:expressjs: typescript: Argument of type 'typeof <express.Router>' is not assignable to parameter of type 'RequestHandlerParams'expressjs:打字稿:“typeof <express.Router>”类型的参数不可分配给“RequestHandlerParams”类型的参数
【发布时间】:2017-12-08 19:21:41
【问题描述】:

我正在将 expressjs 与最新的 typescript 定义文件和来自https://github.com/DefinitelyTyped/DefinitelyTyped 的 typescript 2.3.4 一起使用。 我定义了一个路由器,并希望按照官方 4.x 文档 (app.use('/calendar', router);) 中所述从子路径使用它,但出现以下错误

Error: /Users/matthias/Documents/private workspace/universal/src/server/server.ts (161,34): Argument of type 'typeof "/Users/matthias/Documents/private workspace/universal/src/server/routes/login.router"' is not assignable to parameter of type 'RequestHandlerParams'.
  Type 'typeof "/Users/matthias/Documents/private workspace/universal/src/server/routes/login.router"' is not assignable to type '(RequestHandler | ErrorRequestHandler)[]'.
    Property 'length' is missing in type 'typeof "/Users/matthias/Documents/private workspace/universal/src/server/routes/login.router"'.

这是我正在使用的路由器,省略了实际代码...

const router : express.Router = express.Router();
let loginController = new LoginController();

router.post('/signin', function(req: express.Request, res: express.Response, next: express.NextFunction) {

  ...

  })(req, res, next);
});

...

export default router;

...这是对它的调用的缩短版本。

import * as loginRouter from './routes/login.router';

private app = express();
this.app.use('/api/v1/auth', loginRouter);

我做错了什么还是这个用例没有在打字稿定义文件中正确定义?

亲切的问候

【问题讨论】:

  • 我遇到了一个相关问题,对我来说,解决方案是 this post 在相关的 GitHub 问题上。

标签: javascript express typescript typescript-typings


【解决方案1】:

找到了,import * as ... 好像丢失了它的打字稿信息(IRouter、Router)

解决方案是改用import loginRouter from './routes/login.router';

【讨论】:

  • 奇怪,我遇到了同样的问题,尽管我按照你说的导入了它,但问题仍然存在
【解决方案2】:

我通过删除解决了这个问题

export default router;

在我的路由器模块的末尾。我只是将它导出到我创建它的地方

export const router = express.Router();

然后相应地更新模块的任何导入。

我不知道为什么编译器默认导出有问题,但我知道 TypeScript 的默认导出与 ECMAScript 的默认导出不同。

【讨论】:

    【解决方案3】:

    我犯了一个愚蠢的错误,等待了很长时间来检查解决方案

    我使用app 属性作为方法

    app('/account', accountRoutes)
    

    但我需要改用use() 方法

    app.use('/account', accountRoutes)
    

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 2021-10-18
      • 2021-03-02
      • 2018-06-13
      • 2022-01-21
      • 2017-04-23
      • 2020-01-06
      • 2021-04-09
      相关资源
      最近更新 更多