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 上提供了类型定义。
