在装饰器中扩展类会破坏静态属性继承

时间:2018-10-23 13:04:13

标签: typescript decorator prototypal-inheritance

Codesandbox在文件 weird.spec.ts 中测试失败(忽略React内容)。
要查看失败的测试,请单击右上角的显示测试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. 静态属性,允许以“枚举”方式使用该类
  2. 返回同一个实例(初始化一次)
  3. 保持继承。
  4. 不是一个手工显式编码的“缓存的静态获取器”。我对编译器为我做的很好。

我需要调整什么才能更改当前行为以符合我的需求?

1 个答案:

答案 0 :(得分:1)

这是known issue,静态初始化程序在应用装饰器之前运行,因此会看到未修饰的类。解决方法是,您可以在类定义之后设置Weird.thing

@Validate
class Weird {
    public value: string;

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

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