Я работаю над библиотекой, в которой я хотел бы поддерживать несколько разных расширений для одних и тех же библиотечных методов.
Вот мой сокращенный миксин-код, просто чтобы дать вам представление:
type Creator<T = {}> = new (...args: any[]) => T;
class DefaultCreator {
world:string[] = [];
someMagic() {
this.world.push("magic")
}
getWorldList() {
return this.world;
}
}
function PlantCreator<TBase extends Creator>(Base: TBase) {
return class extends Base {
private world = (<DefaultCreator><any>this).world;
createPlant() {
this.world.push("Plant")
}
};
}
function AnimalCreator<TBase extends Creator>(Base: TBase) {
return class extends Base {
private world = (<DefaultCreator><any>this).world;
createDog() {
this.world.push("Dog")
}
};
}
Я использую это так:
const MyWorld = AnimalCreator(PlantCreator(DefaultCreator));
const world = new MyWorld();
world.someMagic();
world.createPlant();
world.createDog();
Мой вопрос сейчас, как я могу создать класс с помощью «MyWorld» сверху?
abstract class Playground {
abstract createWorld(creator: DefaultCreator);
play() {
this.createWorld(new DefaultCreator());
}
}
Моя идея заключается в реализацииможно использовать функции фреймворка (здесь просто играть) и создавать мир с настроенным создателем (он же Builder).Я попробовал дженерики, но это не компилируется.Что я делаю не так?