2017-03-06 3 views
1

更新疑問からクラス(静的)プロパティを取得します。クライアント側のアプリでインスタンス

は、私は同様にReduxのは、どのように動作するかを、イベント処理システムを実装しています。
イベントタイプをカスタム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); 
} 


オリジナル質問:このコードはコンパイルした作品(コンソール出力 "SubClass1")

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)); 

ながら、編集者が文句を言う:プロパティ 'type' は上存在しません。 「機能」と入力します。

私はIntellij IdeaとTypescriptプレイグラウンドで試しました(www.typescriptlang.org/play)。私はエディタのメッセージを無視するか、インスタンスからその静的プロパティにアクセスするより良い方法はありますか?

+0

エラーが由来する行を含めてください。 – Igor

+0

このコードの目標は何ですか?クラス型の実行時イントロスペクションを取得するのですか?もしそうなら、Metadata 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]; 
} 
関連する問題