我在项目中使用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文件,它没有与原始文件合并,但被用作该模块的唯一声明。为什么会发生这种情况,我该怎么做,即正确地合并了声明?
答案 0 :(得分:2)
您无法扩展log
的签名,因为它被定义为函数类型。如果将其定义为接口,则可以通过添加重载来实现:
interface Debugger {
log: Logger;
}
interface Logger {
(...args: any[]): any
(arg: any): string
}
那你能做什么?
--save-exact
时使用npm install
标志)。对于第二种解决方案,由于不能选择增强,因此您必须重新创建整个定义并添加更改。结果可能如下所示:
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;
}
这种声明文件需要包含在您的项目中。