expressjs:打字稿:“typeof <express.Router>”类型的参数不可分配给“RequestHandlerParams”类型的参数

Posted

技术标签:

【中文标题】expressjs:打字稿:“typeof <express.Router>”类型的参数不可分配给“RequestHandlerParams”类型的参数【英文标题】:expressjs: typescript: Argument of type 'typeof <express.Router>' is not assignable to parameter of type '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 问题上。 【参考方案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)

【讨论】:

以上是关于expressjs:打字稿:“typeof <express.Router>”类型的参数不可分配给“RequestHandlerParams”类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

打字稿捆绑器到打字稿文件

为我的反应打字稿组件库生成/维护打字稿定义文件

打字稿打字,打字文件夹是啥

打字稿 axios 打字

反应打字稿打字不起作用

打字稿:具有有效打字的“找不到模块”