更新疑問からクラス(静的)プロパティを取得します。クライアント側のアプリでインスタンス
は、私は同様に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)。私はエディタのメッセージを無視するか、インスタンスからその静的プロパティにアクセスするより良い方法はありますか?
エラーが由来する行を含めてください。 – Igor
このコードの目標は何ですか?クラス型の実行時イントロスペクションを取得するのですか?もしそうなら、Metadata APIをサーバーサイドのコード用に使用することができます。メタデータのイントロスペクションは、コードがツリーシェイク可能でないことにつながります。 – Martin
マップされた関数から 'handleMouseMove' /' handleKeyPress'の結果を返していません。 –