Currying 2
提出詳細
// CallableArgs<[a: string, b: number, c: boolean]> = [a: string] | [a: string, b: number] | [a: string, b: number, c: boolean] type CallableArgs<A extends unknown[]> = A extends [...infer L, infer _] ? A | CallableArgs<L> : never; // ConsumeArgs<[a: string, b: number, c: boolean], 1> = [b: number, c: boolean] type ConsumeArgs<Arg extends unknown[], Consumed extends number> = Arg extends [...AnyArray<Consumed>, ...infer R] ? R : []; type AnyArray<N extends number, A extends any[] = []> = A["length"] extends N ? A : AnyArray<N, [...A, any]>; type Currying<Arg extends unknown[], Return> = <A extends CallableArgs<Arg>>(...arg: A) => ConsumeArgs<Arg, A["length"]>["length"] extends 0 ? Return : Currying<ConsumeArgs<Arg, A["length"]>, Return>; declare function DynamicParamsCurrying<A extends unknown[], R>(fn: (...arg: A) => R): Currying<A, R>;
提出日時 | 2025-01-21 11:07:34 |
---|---|
問題 | Currying 2 |
ユーザー | ookkoouu |
ステータス | Accepted |
import type { Equal, Expect } from '@type-challenges/utils' const curried1 = DynamicParamsCurrying((a: string, b: number, c: boolean) => true) const curried2 = DynamicParamsCurrying((a: string, b: number, c: boolean, d: boolean, e: boolean, f: string, g: boolean) => true) const curried1Return1 = curried1('123')(123)(true) const curried1Return2 = curried1('123', 123)(false) const curried1Return3 = curried1('123', 123, true) const curried2Return1 = curried2('123')(123)(true)(false)(true)('123')(false) const curried2Return2 = curried2('123', 123)(true, false)(true, '123')(false) const curried2Return3 = curried2('123', 123)(true)(false)(true, '123', false) const curried2Return4 = curried2('123', 123, true)(false, true, '123')(false) const curried2Return5 = curried2('123', 123, true)(false)(true)('123')(false) const curried2Return6 = curried2('123', 123, true, false)(true, '123', false) const curried2Return7 = curried2('123', 123, true, false, true)('123', false) const curried2Return8 = curried2('123', 123, true, false, true)('123')(false) const curried2Return9 = curried2('123', 123, true, false, true, '123')(false) const curried2Return10 = curried2('123', 123, true, false, true, '123', false) type cases = [ Expect<Equal< typeof curried1Return1, boolean>>, Expect<Equal< typeof curried1Return2, boolean>>, Expect<Equal< typeof curried1Return3, boolean>>, Expect<Equal< typeof curried2Return1, boolean>>, Expect<Equal< typeof curried2Return2, boolean>>, Expect<Equal< typeof curried2Return3, boolean>>, Expect<Equal< typeof curried2Return4, boolean>>, Expect<Equal< typeof curried2Return5, boolean>>, Expect<Equal< typeof curried2Return6, boolean>>, Expect<Equal< typeof curried2Return7, boolean>>, Expect<Equal< typeof curried2Return8, boolean>>, Expect<Equal< typeof curried2Return9, boolean>>, Expect<Equal< typeof curried2Return10, boolean>>, ]