TYPESCRIPT: Аргумент типа 'typeof X' нельзя назначить параметру типа 'Y' с расширением - PullRequest
0 голосов
/ 02 апреля 2020

Я начинаю кодировать с машинописью, и у меня есть несколько проблем с компиляцией.

У меня есть несколько классов, и мне кажется, что у меня проблема с иерархией

В моем первом классе (A) Я указал набор свойств / функций. У меня есть второй класс (B), который наследует от класса (A) и который добавляет определенные свойства / функции. Наконец, у меня есть третий класс (C), который наследуется от второго класса (B).

export default class A {
    prop1: string;
    function1() {
        console.log('TEST');
    }
}

export default class B extends A {
    prop2: string;
    function2() {
        console.log('TEST');
    }
}

export default class C extends B {
    prop3: string;
    function3() {
        console.log('TEST');
    }
}

При компиляции я получаю следующее сообщение об ошибке:

TS2345 : Аргумент типа 'typeof C' не может быть назначен параметру типа 'A'. Тип 'typeof C' пропускает следующие свойства из типа 'B': prop1, function1.

Мои 3 класса находятся в 3 отдельных файлах, и я использую экспорт / импорт, и это, кажется, работает ...

У вас есть идея?

TSCONFING:

{
  "compilerOptions": {
    "outDir": "./dist/",
    "noImplicitAny": true,
    "module": "es6",
    "target": "es5",
    "jsx": "react",
    "allowJs": true
  }
}

Я пытаюсь создать код, подобный этому ссылка . Сообщения об ошибках, которые звучат на сайте, не совсем такие, как у меня в редакторе, но, возможно, при исправлении на сайте я найду окончательную проблему ...

Большое вам спасибо.

1 Ответ

0 голосов
/ 02 апреля 2020

Спасибо за ссылку на игровую площадку, это помогло найти проблему.

Это не работало, потому что вы хотите сохранить фабрику, запросили экземпляр.

Основной трюк здесь:

registeredTypes: Map<string,typeof ComponentBase>

Полная исправленная версия здесь :

export class ComponentBase {
  prop: string;

  constructor(prop: string) {
    this.prop = prop;
  }
}

export class Component extends ComponentBase {
  otherProp: string;

  constructor(prop: string, otherProp: string) {
    super(prop);
    this.otherProp = otherProp;
  }
}

export class ButtonGeneric extends Component {
  buttonProp: string;

  constructor(buttonProp: string) {
    super('prop', 'otherProp');
    this.buttonProp = buttonProp;
  }
}

export class ButtonSpecific extends ButtonGeneric {
  buttonSpecProp: string;

  constructor(buttonSpecProp: string) {
    super('buttonProp')
    this.buttonSpecProp = buttonSpecProp;
  }
}



export class ComponentFactory {

  registeredTypes: Map<string,typeof ComponentBase>

  constructor() {
    this.registeredTypes = new Map<string,typeof ComponentBase>();
  }

  register(className: string, classConstructor: typeof ComponentBase) {
    if (!this.registeredTypes.has(className)) {
      this.registeredTypes.set(className, classConstructor);
    }
  }

  create(className: string, properties: string) {
    if (!this.registeredTypes.has(className)) {
      throw Error('The class [' + className + '] doesn\'t exists. Couldn\'t create new object');
    }

    let classConstructor = this.registeredTypes.get(className);
    if (classConstructor == null) { throw new Error('') }
    const instance = new classConstructor(properties);
    return instance;
  }

}

const FactoryButtonConst = 'button';

export class ButtonFactory extends ComponentFactory {
  constructor() {
    super();
    this.register(FactoryButtonConst, ButtonSpecific);
  }

  createButtonSpecific(buttonSpecProp: string) {
    return this.create(FactoryButtonConst, buttonSpecProp);
  }
}
...