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
就是A
,this.x
就是A.x
.
我有一些静态数据,我想通过一些具有基本逻辑的 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
就是A
,this.x
就是A.x
.