扩展不正确的Typescript类定义

时间:2019-07-02 17:57:15

标签: javascript typescript next.js

我在项目中使用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'.

1 个答案:

答案 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。