我们正在Express中使用名为named-routes的扩展名,该扩展名在过去曾为我们提供了很好的服务。现在我们正在逐步使用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: Argument of type '"my.route.name"' is not assignable to parameter of type 'RequestHandlerParams'.
最佳答案
尝试将其包装在名为“ 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;
}
}
}
关于node.js - 扩展Express JS路由器TypeScript的“命名路由”定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48889291/