универсальный класс с заводским дизайном в typescript

#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 ты понимаешь, что я имею в виду