为“命名路由”扩展Express JS路由器TypeScript定义

时间:2018-02-20 15:58:02

标签: node.js typescript express named-routing

我们正在使用名为named-routes的扩展程序,它在过去曾为我们提供过很好的服务。现在我们逐渐使用TypeScript-ifying我们的代码库,我们面临以下问题:模块扩展了Express的路由器对象,因此路由可以有一个标识符:

router.get('/admin/user/:id', 'admin.user.edit', (req, res, next) => …

Express类型当然不知道这个可选标识符并报告编译错误。我按照“Module Augmentation”中的说明创建了以下express-named-routes.d.ts

import { IRouterMatcher } from 'express';
import { PathParams, RequestHandlerParams } from 'express-serve-static-core';

declare module 'express' {
  export interface IRouterMatcher<T> {
    // copied from existing decl. and added the `name` argument
    (path: PathParams, name: string, ...handlers: RequestHandler[]): T;
    (path: PathParams, name: string, ...handlers: RequestHandlerParams[]): T;
  }
}

当然,将其导入相应的文件中:

 import '../types/express-named-routes'

但这仍然给了我一个error TS2345: Argument of type '"my.route.name"' is not assignable to parameter of type 'RequestHandlerParams'.

2 个答案:

答案 0 :(得分:1)

尝试将其包装在名为“named-routes”的模块中,如下所示:

declare module 'named-routes' {
  import { IRouterMatcher } from 'express';
  import { PathParams, RequestHandler, RequestHandlerParams } from 'express-serve-static-core';

  module 'express-serve-static-core' {
    export interface IRouterMatcher<T> {
    // copied from existing decl. and added the `name` argument
      (path: PathParams, name: string, ...handlers: RequestHandler[]): T;
      (path: PathParams, name: string, ...handlers: RequestHandlerParams[]): T;
    }
  }
}

答案 1 :(得分:0)

更新:我现在通过@types/named-routes在DefinitelyTyped上提供了键入内容。