expressjs:typescript:类型'typeof <express.router>'的参数不能赋值给'RequestHandlerParams'类型的参数

时间:2017-07-05 08:30:40

标签: javascript express typescript typescript-typings

我正在使用带有https://github.com/DefinitelyTyped/DefinitelyTyped的最新打字稿定义文件和typescript 2.3.4的expressjs。 我定义了一个路由器,并希望从官方4.x文档(return RedirectToAction("LogIn", "Account"); )中所述的子路径中使用它,但是我得到了以下错误

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;

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

亲切的问候

3 个答案:

答案 0 :(得分:11)

找到它,导入*为...似乎丢失了打字稿信息(IRouter,路由器)

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

答案 1 :(得分:1)

我通过删除解决了此问题

export default router;

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

export const router = express.Router();

,然后相应地更新了模块的所有导入。

我不知道为什么编译器在默认导出时遇到麻烦,但是我知道TypeScript的默认导出与ECMAScript的默认导出不同。

答案 2 :(得分:0)

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

我当时使用app属性作为方法

app('/account', accountRoutes)

但是我需要将路由放入方法use()

app.use('/account', accountRoutes)