Метод класса функции x в typescript

#typescript

#typescript

Вопрос:

Я лучше говорю на typescript, чем на английском, поэтому позвольте мне показать код:

 type FactoryFunction<T> = () => T;

export class Factory<T> {
  public readonly make: FactoryFunction<T>;
  constructor(
    factory: FactoryFunction<T>
  ) {
    this.make = factory;
  }
}

export class SingletonFactory<T> extends Factory<T> {
  private instance: T;

  constructor(
    factory: FactoryFunction<T>
  ) {
    super(factory);
  }

  make = () => {
    if (!this.instance) {
      this.instance = super.make(); //ERROR Only public and protected methods of the base class are accessible via the 'super' keyword.
    }
    return this.instance;
  }
} 

Как вы можете видеть, это не работает. Итак, позвольте мне попробовать что-то изменить:

 type FactoryFunction<T> = () => T;

export class Factory<T> {
  constructor(
    factory: FactoryFunction<T>
  ) {
    this.make = factory;
  }

  make(): T; //ERROR Function implementation is missing or not immediately following the declaration.
}

export class SingletonFactory<T> extends Factory<T> {
  private instance: T;

  constructor(
    factory: FactoryFunction<T>
  ) {
    super(factory);
  }

  make() {
    if (!this.instance) {
      this.instance = super.make();
    }
    return this.instance;
  }
} 

И снова это не работает.

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

Комментарии:

1. Первый пример работает typescriptlang.org/play ? #code/…

Ответ №1:

Проблема с моим кодом была вне кода: в моем tsconfig случае я устанавливал target: "es5" . Проверяя tsconfig по ссылке, предоставленной комментарием @aleksey-l, я меняю его на "ES2017" , и он работает. Кроме того, я вношу некоторые изменения в свой код, если кому-то было интересно, я думаю, что он был менее подробным:

 type FactoryFunction<T> = () => T;

export class Factory<T> {
  constructor(
    public readonly make: FactoryFunction<T>
  ) {}
}

export class SingletonFactory<T> extends Factory<T> {
  private instance: T;

  constructor(
    factory: FactoryFunction<T>
  ) {
    super(() => {
      if (!this.instance) {
        this.instance = factory();
      }
      return this.instance;
    });
  }
}