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)上試過了。我應該忽略編輯器消息,還是有更好的方法從實例中訪問該靜態屬性?
請包括:其中,錯誤源自於行。 – Igor
這段代碼的目標是什麼?它是否獲得了類類型的運行時反思?如果是這樣,如果這是用於服務器端代碼,您可能需要使用元數據api。元數據內省可能導致代碼不能樹形搖擺。 – Martin
您不會從映射函數返回'handleMouseMove' /'handleKeyPress'的結果。 –