class A {
private static readonly letters: { [type: string]: any; } = { 'b' : B }
public static check(): void {
console.log(A.letters)
let letters: { [type: string]: any; } = { 'b' : B }
console.log(letters)
}
}
class B extends A {
}
A.check()
结果:
{ b: undefined }
{ b: { [Function: B] check: [Function], letters: { b: undefined } } }
为什么第一个日志确实未定义?
答案 0 :(得分:1)
正如@ E.Sundin在他的评论中写道,当评估班级B
时,班级A
并不存在。
您需要拥有静态初始化程序:
class A {
private static readonly letters: { [type: string]: any; }
public static init() {
(this as any).letters = { 'b' : B }
}
...
}
...
A.init()
A.check()
因为您希望A.letter
成为readonly
,所以this
转换为any
,否则编译器会抱怨分配给只读属性。
另一种选择是分配一个空对象,然后填充它:
class A {
public static readonly letters: { [type: string]: any; } = {};
...
}
class B extends A { }
A.letters["b"] = B;
但是A.letters
需要公开,您可以将其移至A
之外以保持其隐藏":
const letters: { [type: string]: any; } = {};
class A { ... }
A.letters["a"] = A;
class B extends A { }
letters["b"] = B;