この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - TypeScript タイプパズル
46. implement Subtract<A, B>

type Subtract<A extends number, B extends number> = 
  // Check if A and B are 0 or B is larger than A,
  // which means it's impossible to subtract B from A.
  (A extends 0 ? 0 : (B extends 0 ? A : never))
  // If A and B are not 0 and B is smaller or equal to A,
  // recursively subtract 1 until A becomes 0
  // (subtracting 1 from A is equivalent to adding -1 to A).
  extends infer U ? U extends never ? never :
    U extends 0 ? 0 :
      Subtract<Exclude<A, U>,-1> : never;

TypeScript Playgroundで確認する

説明:

この実装では、ジェネリック型ABが受け入れるのはnumberだけです。アウトプット型は、同じくnumberですが、AからBを引いた差を表します。

まず、B0か、A0の場合は差は0、それ以外の場合は「never」型を返します。つまり、BA以上の場合は差が負数になるため、算出が不可能であると判断しています。

次に、再帰的な呼び出しを行います。ABが両方とも0以外で、かつBAより小さい場合は、Exclude<A, U>を引数に取り、-1を加えて再帰的に処理を続けます(Exclude<A, U>は、Aから再帰的に引いていくということ)。最後に、差が0であれば0を、それ以外の場合は再び上記の処理を続けます。これを、再帰が終了するまで繰り返します。