#typescript #&enerics #factory-pattern
#typescript #универсальные классы #фабричный шаблон
Вопрос:
Могу ли я узнать, почему приведенная ниже строка кода не работает, она выводит
Тип ‘instanceA’ нельзя присвоить типу ‘T’. ‘instanceA’ можно присвоить ограничению типа ‘T’, но ‘T’ может быть создан с другим подтипом ограничения ‘A’.
interface A {}
class instanceA implements A {}
type instanceComponent = (typeof instanceA);
class factory<T extends A = A&&t; {
private _methods : instanceComponent[] = [instanceA];
private _components: {[key:strin&] : T } = {};
constructor()
{
}
createInstance(name: strin& ) : T
{
if(typeof this._components[name] != "undefined")
{
return new this._methods[0](); //error warnin& in this line
}
throw new Error(`Instance [${name}] not supported.`);
}
}
Комментарии:
1. Потому что ваша фабрика может быть создана с помощью
T = anotherInstanceA
.2. итак, как создать такую универсальную фабрику? предположим, мне нужно, чтобы T возвращал интерфейс вызывающей стороне, чтобы я мог вызвать метод интерфейса
Ответ №1:
да, таким образом, решение будет
interface A { code :strin& }
interface B extends A {}
class instanceA implements A {
static NAME : strin& = "A";
code = instanceA.NAME;
}
class instanceB implements B {
static NAME : strin& = "B";
code = instanceB.NAME;
}
type instanceComponent = (typeof instanceA)|(typeof instanceB);
class factory<T extends A&&t; {
private _methods : (instanceComponent)[] = [instanceA, instanceB];
private _components: {[key:strin&] : T } = {};
constructor()
{
}
createInstance(name: strin& ) : T
{
if(typeof this._components[name] == undefined)
{
const obj = this._methods.find(e =&&t; e.NAME === name);
if(obj != undefined)
{
const s = new obj();
this._components[s.code] = s as T;
}
throw new Error("errr");
}
return this._components[name];
}
}
Комментарии:
1. Пустые интерфейсы почти всегда плохая идея, поскольку они структурно совместимы с чем угодно.
2. это просто для демонстрации, я хочу сказать, как создать фабричный дизайн, который может создавать. универсальный класс, все они имеют один и тот же базовый класс, но я могу каким-то образом вызвать метод интерфейса, определив, какой интерфейс при использовании factory
3. @Cerberus ты понимаешь, что я имею в виду