Добавление к существующему прототипу объекта в машинописи
Я использую фантастическое решение для тестирования Wallaby для запуска тестов в реальном времени, но оно - по умолчанию - перехватывает stdout и stderr (по уважительным причинам). В тех случаях, когда я не хочу, чтобы это происходило, я могу переопределить поведение, поместив переменную в console
команда вроде так:
console._restored = true;
это будет получено тестовым организатором Wallaby и временно отправит потоки событий обратно в их обычные места назначения. Это решение работает просто отлично, но Typescript не радует:
Я пытаюсь найти способ добавить определение прототипа интерфейса "Консоль".
В моей первой грубой попытке я просто посмотрел определение консоли 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;