我在项目中使用NPM软件包next-routes。默认导出是一个类,其类型定义如下:
export default class Routes implements Registry {
getRequestHandler(app: Server, custom?: HTTPHandler): HTTPHandler;
add(name: string, pattern?: string, page?: string): this;
add(pattern: string, page: string): this;
add(options: { name: string; pattern?: string; page?: string }): this;
Link: ComponentType<LinkProps>;
Router: Router;
}
完整文件可在软件包here中找到。
该类定义缺少包默认导出名为findAndGetUrls
中公开的方法之一。为此,如何使用自己的类型扩展类定义?我考虑过创建自己的类,该类实现NextRoutes,但定义缺少的方法定义,如下所示:
import NextRoutes from 'next-routes';
class Routes implements NextRoutes {
findAndGetUrls(
nameOrUrl: string,
params: {
[key: string]: string;
},
): void;
}
但是此错误:Function implementation is missing or not immediately following the declaration.
编辑
我的新尝试是在项目中使用以下内容创建一个typings/next-routes.d.ts
文件:
import NextRoutes from 'next-routes';
declare module 'next-routes' {
class Routes extends NextRoutes {
findAndGetUrls(
nameOrUrl: string,
params: {
[key: string]: string;
},
): void;
}
export = Routes;
}
这使我的代码对findAndGetUrls的使用感到满意,但是现在它抱怨没有其他方法存在,因此无法正确扩展类型。例如Property 'add' does not exist on type 'Routes'.
答案 0 :(得分:1)
我已经玩了一段时间了,Typescript不允许您重新定义类。但是,如果您将默认值重新导出为 interface 而不是类,则这似乎可行:
custom-next-routes.d.ts :
import NextRoutes, { RouteParams } from "next-routes";
declare module "next-routes" {
export default interface Routes extends NextRoutes {
findAndGetUrls(nameOrUrl: string, params: RouteParams): void;
}
}
您仍然必须将其命名为Routes
,以便Typescript知道如何将其与export default class Routes implements Registry
软件包中的next-routes
合并。
我只在最新的Typescript版本(当前为3.5.2)上尝试过此操作,因此,如果您使用的是旧版本,则为YMMV。