2017-03-06 28 views
1

更新問題得到一個類(靜態)屬性:從實例

在客戶端應用程序,我實現一個事件處理系統,類似於終極版是如何工作的。
我將事件類型定義爲自定義類Event的子類。所有這些子類都有自己的type靜態屬性。
我通過創建子類的實例並將其發送到主處理函數來觸發事件。 在這個主處理程序中,我想使用type來決定調用哪個特定的處理程序。

由於事件是事件子類的實例,因此我使用event.constructor.type
它編譯和工作正常,但IDE抱怨:Property 'type' does not exist on type 'Function'(我也標記在代碼示例中)。

我應該忽略這個消息,還是有更好的方法來訪問實例中的靜態屬性?

type State = {}; 

class Event { 
    public static type: string; 
} 

class MouseMoveEvent extends Event { 
    public static type = "MouseMoveEvent"; 
    constructor(public x: number, public y: number) { 
     super(); 
    } 
} 

class KeypressEvent extends Event { 
    public static type = "KeyPressEvent"; 
    constructor(public key: string) { 
     super(); 
    } 
} 

function handleMouseMove(event: MouseMoveEvent, state: State): State { 
    // return some new state 
} 

function handleKeyPress(event: KeyPressEvent, state: State): State { 
    // return some new state 
} 

const handlerMap: { [type: string]: (event: Event, state: State) => State; } = { 
    [MouseMoveEvent.type]: (event: Event, state: State) => handleMouseMove(event as MouseMoveEvent, state), 
    [KeyPressEvent.type]: (event: Event, state: State) => handleKeyPress(event as KeyPressEvent, state) 
    // etc. 
}; 

// The main handler, it receives all triggered events, and decides which specific handler to call, based on the `type` property. 
function handleEvent(event: Event, state: State): State { 
    // the editor complains here 
    return handlerMap[event.constructor.type](event, state); 
} 


原題:

class BaseClass { 
    public static type: string; 
} 

class SubClass1 extends BaseClass { 
    public static type = "SubClass1"; 
} 

class SubClass2 extends BaseClass { 
    public static type = "SubClass2"; 
} 

const map: {[type: string]: number} = { 
    [SubClass1.type]: 1, 
    [SubClass2.type]: 2 
}; 

function getNumber(x: BaseClass): number { 
    return map[x.constructor.type]; // complains here 
} 

const foo = new SubClass1(); 
console.log(getNumber(foo)); 

儘管此代碼編譯和作品(控制檯輸出 「SubClass1」),編輯抱怨:房產 '類型' 不存在上鍵入'功能'。

我在Intellij Idea和Typescript遊樂場(www.typescriptlang.org/play)上試過了。我應該忽略編輯器消息,還是有更好的方法從實例中訪問該靜態屬性?

+0

請包括:其中,錯誤源自於行。 – Igor

+0

這段代碼的目標是什麼?它是否獲得了類類型的運行時反思?如果是這樣,如果這是用於服務器端代碼,您可能需要使用元數據api。元數據內省可能導致代碼不能樹形搖擺。 – Martin

+0

您不會從映射函數返回'handleMouseMove' /'handleKeyPress'的結果。 –

回答

1

您可以創建爲BaseClass構造類型:

interface BaseClassStatic { 
    type: string; 
    new(): BaseClass; 
} 

再投給它:

function getNumber(x: BaseClass): number { 
    return map[(x.constructor as BaseClassStatic).type]; 
}