#javascript #typescript #decorator
#javascript #typescript #декоратор
Вопрос:
Я пытаюсь реализовать шаблон декоратора среды выполнения (не путать с другим типом декоратора, хотя их можно использовать для реализации) в общем виде. Например, в этом примере BoomThingDecorator является фактическим конкретным декоратором, а ThingDecorator — это удобный базовый класс, определенный так, чтобы не нужно было повторять объявления пересылки для каждого декоратора для этого типа. Вместо того, чтобы повторять прямые объявления для каждого класса, который мы хотим украсить, мы можем в общем виде создать такой базовый класс декоратора для любого интерфейса. Я не уверен, возможно ли это, поскольку интерфейсы TypeScript не существуют во время выполнения.
interface IThing {
run(): void;
}
class Thing implements IThing {
run(): void {
null;
}
}
abstract class ThingDecorator implements IThing {
protected base: IThing;
constructor(base: IThing) {
this.base = base;
}
run(): void {
return this.base.run();
}
}
class BoomThingDecorator extends ThingDecorator {
boom(): number {
return 1;
}
}
например, что-то вроде
abstract class Decorator<T> {
protected base: T;
constructor(base: T) { this.base = base; }
// something to forward all the methods of base
}
class BoomThingDecorator extends Decorator<IThing> {
// decorator methods
}
Комментарии:
1. Это правда, что интерфейсы не существуют во время выполнения, поэтому вам нужно будет указать декоратору, какие методы пересылать. Учитывая это ограничение, работает ли это для вас? Если это так, я напишу это как ответ. Если нет, пожалуйста, поясните, почему нет, чтобы я мог решить эту проблему.
2. Похоже, что это самая близкая возможная вещь, и, перечислив все методы, которые будут перенаправлены, декоратор реализует интерфейс. Это сработает, спасибо.