【问题标题】:adding to an existing Object prototype in typescript在打字稿中添加到现有的对象原型
【发布时间】:2017-11-04 08:59:49
【问题描述】:

我正在使用出色的 Wallaby 测试解决方案来运行实时测试,但它——默认情况下——拦截 stdoutstderr(有充分的理由)。在我希望这种情况发生的情况下,我可以通过将变量塞入console 命令来覆盖该行为,如下所示:

console._restored = true;

这将由 Wallaby 测试运行程序获取,并将事件流暂时发送回其正常目的地。这个解决方案工作得很好,但 Typescript 不高兴:

我正在尝试找到一些方法来添加到“控制台”界面的 原型 定义中。

在我的第一次粗略尝试中,我只是查找了 Console 的 NodeJS 定义,并添加了 _restored 属性添加到我的测试帮助文件中:

与大多数绝望的情况一样,它以眼泪告终。显然,仍然使用已经定义的全局定义。

无论如何,我们将不胜感激。

【问题讨论】:

    标签: typescript wallaby.js


    【解决方案1】:

    我最初的尝试实际上接近正确。您可以将接口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;
    }
    

    【讨论】:

      【解决方案2】:

      使用您要在 Playground 中添加作品的属性扩展 Console 界面:

      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;
      

      【讨论】:

      • 奇怪。我确定我试过了,但让我再试一次。另外,不确定我的版本有什么不同......我包括你的建议,但也添加到标准定义中。
      • 是的,我相信你没有遇到错误的原因是你没有首先使用 @types/node 定义......我希望我的所有其他代码都使用这个,它只是在一些需要扩展接口的测试情况下。
      • @ken 请尝试在 .d.ts 文件中定义接口。 :)
      • 不确定这有多实用……可惜没有允许添加像 @types/node 这样的 npm 模块的在线游乐场;它很容易在当地环境中重现,对吗?您还可以在 github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/… 找到标准 .d.ts
      • 如果你愿意,你可以使用 plnkr 或 jsfiddle。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 2023-03-07
      • 2018-04-26
      • 2017-01-12
      相关资源
      最近更新 更多