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