Type Challenges Judge

Currying 2

提出詳細

type Heads<A extends unknown[]> = A extends [...infer L, infer _] ? A | Heads<L> : never; type Rests<Arg extends unknown[], Called extends unknown[]> = Arg extends [...AnyArray<Called["length"]>, ...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 Heads<Arg>>(...arg: A) => Rests<Arg, A>["length"] extends 0 ? Return : Currying<Rests<Arg, A>, Return> declare function DynamicParamsCurrying<A extends unknown[], R>(fn: (...arg: A) => R): Currying<A, R>;
提出日時2025-01-21 10:24:16
問題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>>, ]