Javascript 扩展不正确的Typescript类定义

Javascript 扩展不正确的Typescript类定义,javascript,typescript,next.js,Javascript,Typescript,Next.js,我正在我的项目中使用NPM包。默认导出是一个具有如下类型定义的类: 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):

我正在我的项目中使用NPM包。默认导出是一个具有如下类型定义的类:

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;
}
import NextRoutes from 'next-routes';

class Routes implements NextRoutes {
  findAndGetUrls(
    nameOrUrl: string,
    params: {
      [key: string]: string;
    },
   ): void;
}
但这会导致错误:
函数实现丢失或声明后没有立即执行。

编辑

我的新尝试是在我的项目中创建一个
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的使用感到高兴,但现在它抱怨其他方法都不存在,因此没有正确扩展类型。e、 g.
属性“add”在类型“Routes”上不存在。

我已经使用它一段时间了,Typescript不允许您重新定义该类。但是,如果将默认值重新导出为接口而不是类,则它似乎可以工作:

自定义下一条路线。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知道如何将其与
导出默认类Routes implements Registry
中的
下一个Routes
包合并


我只在最新的Typescript版本(目前为3.5.2)上尝试过这个,所以如果您使用的是较旧的版本,那么YMMV。

您不应该使用
扩展
而不是
实现
?@rickdenhaan我不知道,应该吗?我只是在做一件类似于他们在next routes包中所做的事情(即我问题开头的代码片段),我是否应该创建一个
next routes.d.ts
文件并以某种方式改进类型定义,但不完全重写它?是的,他们的类“实现”
Registry
,因为
Registry
是一个接口。您不是在实现接口,而是在类中添加函数。您可以使用
extensions
来实现这一点。您的文件可以调用任何东西,只要它以
.d.ts
结尾,因为它只是一个类型声明,而不是实际的实现。我的朋友,您是个天才。我甚至找到了一个现有的PR来解决这个问题,这个问题在项目中已经存在了5个月()。我猜这个软件包确实被抛弃了(有点奇怪,每月下载47k次)。至少我可以从公共关系中得到更好的定义。