2017-02-11 45 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不存在。

你需要有一個靜態初始化:

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.letterreadonly還有的thisany鑄造否則編譯器抱怨分配到只讀屬性。


另一個選擇是指定一個空的對象,後來填充它:

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;