网站搜索

node.js - 扩展 Express JS 路由器 TypeScript 定义以支持“named-routes”


我们正在使用一个名为 named-routes 的扩展与 Express 配合使用,这在过去对我们非常有帮助。现在,由于我们正在逐步将代码库 TypeScript 化,我们面临以下问题:该模块扩展了 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: 类型为 '"my.route.name"' 的参数不能分配给类型 'RequestHandlerParams' 的参数。

答案#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;
    }
  }
}

答案#2

更新:我现在已经通过 @types/named-routes 在 DefinitelyTyped 上提供了类型定义。