私は、(別の名前を持つ)特定のインターフェイスで単一のメソッドを実装することが予想されるクラスを作成しようとしています。どのようにテンプレートメソッドをメンバメソッドとして宣言できますか?*プロパティではありませんか?
これは、TypeScriptのジェネリックスを介して機能します(下記のRpcHandler
を参照)。
ただし、TypeScriptはメンバメソッドとメンバプロパティを区別するため、プロパティとしてではなくメソッドとして実装するときにコンパイルエラーが発生します。
方法は、プロパティをRpcHandler#execute
が方法であることを活字体へのヒント、そしてないためにありますか?
class Thing { }
interface RpcActions {
getThing(id: string): Promise<Thing>
}
// ---
class RpcHandler<ActionName extends keyof RpcActions> {
execute: RpcActions[ActionName];
}
// ---
class GetThingAsMethodHandler extends RpcHandler<'getThing'> {
// How can I declare the type of execute so that it is a member
// and not a property, so this doesn't error?
// Error: Class 'RpcHandler<"makeThing">' defines instance member
// property 'execute', but extended class 'MakeThingHandler' defines
// it as instance member function.
async execute(data: Object): Promise<Thing> {
return new Thing();
}
}
// Workaround, for now
class GetThingAsPropertyHandler extends RpcHandler<'getThing'> {
execute = async (id: string): Promise<Thing> => {
return new Thing();
}
}
Ah!最後に表示されるエラーは、テンプレートタイプとして 'getThing'が必要なためです( 'makeThing'ではなく)。私は少し例をきれいにしましたが、インターフェースは私が探しているものです、ありがとう! – Nevir