2017-02-11 18 views
3
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 } } } 

は定義されていませんか?

+2

あなたが参照するクラス( 'B')は割り当て時に定義されていないので、 –

答えて

1

@ E.Sundinがコメントに書いたように、クラスAが評価されるとき、クラスBは存在しません。

あなたは、静的初期化子ている必要があります:あなたはthisanyへのキャストがありますreadonlyするA.letterを望んでいたので

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.lettersその後、

class A { 
    public static readonly letters: { [type: string]: any; } = {}; 

    ... 
} 

class B extends A { } 
A.letters["b"] = B; 

しかし、あなたは「隠された」それを維持するためにAの外に移動することができます。

const letters: { [type: string]: any; } = {}; 

class A { ... } 
A.letters["a"] = A; 

class B extends A { } 
letters["b"] = B;