在打字稿中添加到现有的对象原型
adding to an existing Object prototype in typescript
我正在使用出色的 Wallaby 测试解决方案进行 运行 实时测试,但它默认情况下会拦截 stdout 和 stderr(有充分的理由)。在我不希望发生这种情况的情况下,我可以通过将变量塞入console
命令来覆盖行为,如下所示:
console._restored = true;
这将由 Wallaby 测试 运行ner 拾取并暂时将事件流发送回其正常目的地。这个解决方案工作得很好,但 Typescript 不满意:
我正在尝试找到一些方法来添加到 "Console" 接口的 原型 定义中。
在我第一次粗略的尝试中,我只是查找了 Console 的 NodeJS 定义,并添加到我的测试助手文件中,添加了 _restored
属性 :
与大多数绝望的案例一样,它以泪水告终。显然仍然使用已经定义的全局定义。
无论如何,我们将不胜感激。
扩展 Console 界面与 属性 你想在 playground 中添加作品:
interface Console {
_restored: boolean;
}
console._restored = true;
您可以看到它正在运行 here。
但是,当您使用模块时,这似乎不起作用。在那种情况下,您必须在 .d.ts 文件中定义 Console 接口。
interface Console {
_restored: boolean;
}
anywhereelse.ts:
import * as something from './something';
console._restored = true;
我最初的尝试实际上接近于正确。您可以将接口 Console
重新定义为:
// tslint:disable-next-line
interface Console {
_restored: boolean;
Console: typeof NodeJS.Console;
assert(value: any, message?: string, ...optionalParams: any[]): void;
dir(obj: any, options?: {showHidden?: boolean, depth?: number, colors?: boolean}): void;
error(message?: any, ...optionalParams: any[]): void;
info(message?: any, ...optionalParams: any[]): void;
log(message?: any, ...optionalParams: any[]): void;
time(label: string): void;
timeEnd(label: string): void;
trace(message?: any, ...optionalParams: any[]): void;
warn(message?: any, ...optionalParams: any[]): void;
}
但是您还必须声明 console
作为您新定义的接口:
declare var console: Console;
在我的测试助手文件中定义了这个,我现在可以添加以下函数而不会出错:
export function restoreStdoutAndStderr() {
console._restored = true;
}
我正在使用出色的 Wallaby 测试解决方案进行 运行 实时测试,但它默认情况下会拦截 stdout 和 stderr(有充分的理由)。在我不希望发生这种情况的情况下,我可以通过将变量塞入console
命令来覆盖行为,如下所示:
console._restored = true;
这将由 Wallaby 测试 运行ner 拾取并暂时将事件流发送回其正常目的地。这个解决方案工作得很好,但 Typescript 不满意:
我正在尝试找到一些方法来添加到 "Console" 接口的 原型 定义中。
在我第一次粗略的尝试中,我只是查找了 Console 的 NodeJS 定义,并添加到我的测试助手文件中,添加了 _restored
属性 :
与大多数绝望的案例一样,它以泪水告终。显然仍然使用已经定义的全局定义。
无论如何,我们将不胜感激。
扩展 Console 界面与 属性 你想在 playground 中添加作品:
interface Console {
_restored: boolean;
}
console._restored = true;
您可以看到它正在运行 here。
但是,当您使用模块时,这似乎不起作用。在那种情况下,您必须在 .d.ts 文件中定义 Console 接口。
interface Console {
_restored: boolean;
}
anywhereelse.ts:
import * as something from './something';
console._restored = true;
我最初的尝试实际上接近于正确。您可以将接口 Console
重新定义为:
// tslint:disable-next-line
interface Console {
_restored: boolean;
Console: typeof NodeJS.Console;
assert(value: any, message?: string, ...optionalParams: any[]): void;
dir(obj: any, options?: {showHidden?: boolean, depth?: number, colors?: boolean}): void;
error(message?: any, ...optionalParams: any[]): void;
info(message?: any, ...optionalParams: any[]): void;
log(message?: any, ...optionalParams: any[]): void;
time(label: string): void;
timeEnd(label: string): void;
trace(message?: any, ...optionalParams: any[]): void;
warn(message?: any, ...optionalParams: any[]): void;
}
但是您还必须声明 console
作为您新定义的接口:
declare var console: Console;
在我的测试助手文件中定义了这个,我现在可以添加以下函数而不会出错:
export function restoreStdoutAndStderr() {
console._restored = true;
}