如何为项目修复库中损坏的类型签名?

时间:2019-02-09 19:46:27

标签: typescript declaration

我在项目中使用debug@types/debug软件包,并且最近对@types/debug进行的更新破坏了我知道有效的代码的输入。

是否有一种方法可以使用声明合并来干净地修复项目中的类型,因此我不必等待修复即可将其上游或复制整个.d.ts?

@types/debug的相关部分是:

declare var debug: debug.Debug;

export = debug;

declare namespace debug {
    type IDebugger = Debugger;
    interface Debugger {
        log: (v: any) => string;
    }
}

我添加了自己的.d.ts文件,

declare module 'debug' {
    interface Debugger {
        log: (...args: any[]) => any;
    }
}

但是现在我在尝试使用原始声明文件中的其他成员时遇到错误:“模块'debug'没有导出的成员',诸如此类。似乎发生的事情是,一旦我添加了自己的.d.ts文件,它没有与原始文件合并,但被用作该模块的唯一声明。为什么会发生这种情况,我该怎么做,即正确地合并了声明?

1 个答案:

答案 0 :(得分:2)

您无法扩展log的签名,因为它被定义为函数类型。如果将其定义为接口,则可以通过添加重载来实现:

interface Debugger {
    log: Logger;
}

interface Logger {
  (...args: any[]): any
  (arg: any): string
}

那你能做什么?

  1. 安装其他版本的打字并锁定(运行--save-exact时使用npm install标志)。
  2. 在本地覆盖这些类型,并继续使用它们,直到上游的定义得到修复。理想情况下,将您的更改贡献给DefinitelyTyped。

对于第二种解决方案,由于不能选择增强,因此您必须重新创建整个定义并添加更改。结果可能如下所示:

debug.d.ts

declare module 'debug' {
  var debug: debug.Debug & { debug: debug.Debug, default: debug.Debug };

  namespace debug {
    interface Debug {
      (namespace: string): Debugger;
      coerce: (val: any) => any;
      disable: () => void;
      enable: (namespaces: string) => void;
      enabled: (namespaces: string) => boolean;

      names: RegExp[];
      skips: RegExp[];

      formatters: Formatters;
    }

    type IDebug = Debug;

    interface Formatters {
      [formatter: string]: (v: any) => string;
    }

    type IDebugger = Debugger;

    interface Debugger {
      (formatter: any, ...args: any[]): void;

      enabled: boolean;
      log: Logger
      namespace: string;
      extend: (namespace: string, delimiter?: string) => Debugger;
    }

    interface Logger {
      (...args: any[]): any
      (arg: any): string
    }
  }

  export = debug;
}

这种声明文件需要包含在您的项目中。