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”类型的参数的主要内容,如果未能解决你的问题,请参考以下文章