TypeScript:在子类中初始化静态数据? (或其他存储全局数据的机制)

TypeScript: Reinitializing static data in a subclass? (or other mechanism to store gobal data)

我有一些静态数据,我想通过一些具有基本逻辑的 API 来访问这些数据。 (即,它是关于 Java classes 的元数据。)

我已将 API 放入 class 的几个静态方法,并将数据存根放入静态字段。

然后,在子class(生成的)中,我用一些数组重新定义了该字段。而且我可以从父和子 class 访问相同的字段。不确定。我怀疑这曾经有效,但随着 TS 2.0 变得更严格而停止工作。

无论如何。我正在寻找一种机制来正确地实现这一点。我需要静态访问它,这些是全球使用的数据。在 Java 中,我可能会让父对象成为单身人士并在 static {} 中操纵静态数据槽(不管这听起来多么可怕)。

TypeScript 中的等价物是什么?

class A {
    static foo = [-1];
    static getLastFoo(){ return A.foo[A.foo.length-1]; } 
}

class B extends A {
    static foo = [1,2,3]; // Did this work in TS 1.8?
}

B.getLastFoo(); // <--- gives 3

我认为这在某种程度上可以通过原型实现。不确定 TypeScript 是否允许这样做。

您的代码在 typescript 1.8 中也不能正常工作,就像您正在做的那样:

return A.foo[A.foo.length - 1];

应该总是 return -1,如果你想让它 return 3 那么它应该这样做:

class A {
    static foo = [-1];
    static getLastFoo() { return this.foo[this.foo.length - 1]; }
}

this 在静态上下文中是 class 而不是实例,因此在 B 上调用 getLastFoo 函数时,它将使用 B.foo


编辑

这个:

class A {
    static x = 3;
    static fn() {
        console.log(this);
    }
}

编译成这样:

var A = (function () {
    function A() {
    }
    A.fn = function () {
        console.log(this);
    };
    A.x = 3;
    return A;
}());

这里就清楚了A.fn里面的this就是Athis.x就是A.x.