この解答例は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を、それ以外の場合は再び上記の処理を続けます。これを、再帰が終了するまで繰り返します。