Step
入力としてtype の値を必要とA
し、 type の値を与えるa の概念がありますB
。
class Step<A, B> {
constructor(private readonly f: (a: A) => B) { }
public run(a: A): B {
return this.f(a);
}
}
ここで、2 つのステップを作成したいので、内部は次のようになりますclass Step
。
public andThen<C, D>(nextStep: Step<C, D>): Step<A, D> {
return new Step<A, D>((state: A) => {
const b: B = this.f(state);
return nextStep.run(b); // <---- compile error, B and C have no relation defined
});
}
私が達成したいのは、型B
を期待する関数に型を渡すことができることを型システムに何らかの形で伝えることですC
(構造型付けは、 のすべてのフィールドC
が に存在することを確認する必要がありますB
)。これにより、行が正常にreturn nextStep.run(b)
機能します。
例:
const stepA: Step<{}, {a: number, b: string}> = new Step((input: {}) => ({ a: 5, b: "five" }));
const stepB: Step<{a: number}, {c: number}> = new Step((input: {a: number}) => ({c: input.a + 5}));
const steps = stepA.andThen(stepB)
ご覧のとおりstepB
、 requires が入力であるため、 is{a: number}
からの出力を供給することができます。しかし、 で関係を定義する方法がわかりません。これを達成する方法はありますか?stepA
{a: number, b: string}
andThen