Расширение класса в декораторе нарушает наследование статического свойства - PullRequest
0 голосов
/ 23 октября 2018

Codesandbox с ошибочным тестом в файле weird.spec.ts (Игнорировать реакцию).
Чтобы увидеть неудачный тест, нажмите Показать тесты в правом верхнем углу.Show Tests icon

У меня есть класс и декоратор, который я использую для проверки:

function Validate(original: any) {
    return (class extends original {
            constructor(...args: any[]) {
                super(...args);
                // some validation here,
                // throwing a custom error
            }
        }
    ) as any;
}

@Validate
export class Weird {
    public value: string;

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

    static thing = new Weird('thing');
}

Моя проблема (как видно из теста с ошибками)что

Weird.thing instanceof Weird // false

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

  1. Статическое свойство, позволяющее использовать класс как «enum» способом
  2. Возвращает тот же экземпляр (инициализированный один раз)
  3. Поддерживает наследование.
  4. Не является явно закодированным вручную "кэшированным статическим получателем".Я в порядке с компилятором, делающим это для меня.

Что мне нужно настроить, чтобы изменить текущее поведение в соответствии с тем, что я хочу?

1 Ответ

0 голосов
/ 24 октября 2018

Это известная проблема , что статические инициализаторы запускаются до применения декоратора и, следовательно, видят недекорированный класс.В качестве обходного пути вы можете установить Weird.thing после определения класса:

@Validate
class Weird {
    public value: string;

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

    static thing: Weird;
}
Weird.thing = new Weird('thing');
...