在打字稿中添加到现有的对象原型

adding to an existing Object prototype in typescript

我正在使用出色的 Wallaby 测试解决方案进行 运行 实时测试,但它默认情况下会拦截 stdoutstderr(有充分的理由)。在我希望发生这种情况的情况下,我可以通过将变量塞入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;
}