Добавление к существующему прототипу объекта в машинописи

Я использую фантастическое решение для тестирования Wallaby для запуска тестов в реальном времени, но оно - по умолчанию - перехватывает stdout и stderr (по уважительным причинам). В тех случаях, когда я не хочу, чтобы это происходило, я могу переопределить поведение, поместив переменную в console команда вроде так:

console._restored = true;

это будет получено тестовым организатором Wallaby и временно отправит потоки событий обратно в их обычные места назначения. Это решение работает просто отлично, но Typescript не радует: сообщение об ошибке ts

Я пытаюсь найти способ добавить определение прототипа интерфейса "Консоль".

В моей первой грубой попытке я просто посмотрел определение консоли NodeJS и добавил в файл вспомогательного теста с помощью _restored добавленная недвижимость:

Как и в большинстве случаев отчаяния, это закончилось слезами. По-видимому, уже определенное глобальное определение все еще используется.

В любом случае, любая помощь будет оценена.

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;
}

Расширение интерфейса консоли с помощью свойства, которое вы хотите добавить, работает на игровой площадке:

interface Console {
    _restored: boolean;
}

console._restored = true;

Вы можете видеть это работает здесь.

Однако это не работает, когда вы используете модули. В этом случае вы должны определить интерфейс консоли в файле .d.ts.

interface Console {
    _restored: boolean;
}

anywhereelse.ts:

import * as something from './something';


console._restored = true;
Другие вопросы по тегам