在typescript中添加现有的Object原型

时间:2017-06-02 21:18:47

标签: typescript wallaby.js

我使用梦幻般的Wallaby测试解决方案来运行实时测试,但默认情况下会拦截 stdout stderr (有充分理由)。在我希望这种情况发生的情况下,我可以通过将变量塞入console._restored = true; 命令来覆盖行为,如下所示:

_restored

这将由Wallaby测试跑者接收,并暂时将事件流发送回正常目的地。这个解决方案工作得很好但是Typescript并不高兴: ts error message

我正在尝试找到一些方法来添加" Console"的原型定义。接口。

在我的第一次粗略尝试中,我只是查找控制台的NodeJS定义,并添加到添加了 public IEnumerable<Location> GetChild(int id) { DBEntities db = new DBEntities(); var locations = db.Locations.Where(x => x.ParentLocationID == id || x.LocationID == id).ToList(); var child = locations.AsEnumerable().Union( db.Locations.AsEnumerable().Where(x => x.ParentLocationID == id).SelectMany(y => GetChild(y.LocationId))).ToList(); return child; } 属性的测试帮助文件中:

enter image description here

与大多数绝望案件一样,它以泪水结束。显然,仍然使用已定义的全局定义。

无论如何,任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

控制台界面扩展为您要添加的媒体资源:

interface Console {
    _restored: boolean;
}

console._restored = true;

您可以看到它正常工作here

但是,当您使用模块时,这似乎不起作用。在这种情况下,您必须在 .d.ts 文件中定义控制台界面。

interface Console {
    _restored: boolean;
}

anywhereelse.ts:

import * as something from './something';


console._restored = true;