2

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

4

1 に答える 1