この解答例は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で確認する
説明:
この実装では、ジェネリック型AとBが受け入れるのはnumberだけです。アウトプット型は、同じくnumberですが、AからBを引いた差を表します。
まず、Bが0か、Aが0の場合は差は0、それ以外の場合は「never」型を返します。つまり、BがA以上の場合は差が負数になるため、算出が不可能であると判断しています。
次に、再帰的な呼び出しを行います。AとBが両方とも0以外で、かつBがAより小さい場合は、Exclude<A, U>を引数に取り、-1を加えて再帰的に処理を続けます(Exclude<A, U>は、Aから再帰的に引いていくということ)。最後に、差が0であれば0を、それ以外の場合は再び上記の処理を続けます。これを、再帰が終了するまで繰り返します。