TypeScript将类型保存为未定义

时间:2017-02-11 19:56:52

标签: javascript node.js typescript

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 } } }

为什么第一个日志确实未定义?

1 个答案:

答案 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()

code in playground

因为您希望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;