typescript - 如何修复项目库中损坏的类型签名?
问题描述
我在我的项目中使用debug
and@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;
}
}
但现在我在尝试使用原始声明文件中的其他成员时遇到错误:“模块'调试'没有导出的成员'等等。似乎发生的事情是,一旦我添加了自己的 .d.ts 文件,它就没有合并与原始的,但它被用作该模块的唯一声明.为什么会发生这种情况,我该如何做我想做的事,即正确合并声明?
解决方案
您不能增加 的签名log
,因为它被定义为函数类型。如果将其定义为接口,则可以通过添加重载来实现:
interface Debugger {
log: Logger;
}
interface Logger {
(...args: any[]): any
(arg: any): string
}
所以,你可以做什么?
- 安装不同版本的类型并锁定它(
--save-exact
运行时使用标志npm install
)。 - 在本地覆盖类型并继续使用它们,直到上游的定义被修复。理想情况下,您自己将更改贡献给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;
}
这样的声明文件需要包含在您的项目中。
推荐阅读
- laravel - Laravel 5.8 此路由不支持 PUT 方法。支持的方法:GET、HEAD、POST
- c++ - 向使用 raw_ptr 的类发出 unique_ptr 为 nullptr 的信号
- selenium - Cucumber 与 Jenkins 的集成在远程机器上成功构建,但在带有 net.serenity-bdd 插件的 Serenity Reports 中有黑色屏幕截图
- mysql - 有什么方法可以将 PostgreSQL 数据库实时流备份到 MySQL?或者可以使用 PostgreSQL 转储到 MySQL 吗?
- asp.net - 使用VB.Net在Gridview中获取订单ID的行号
- docker - Docker compose:无法在应用程序中打开角度容器
- php - 如何在php中构造url?
- r - 如何使用 for 循环来简化我的代码?
- c - 指针或内存地址可以作为 printf() 函数中的参数吗?
- java - Highcharts HIExporting 部分不适用于 android studio java 应用