#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;
});
}
}