Comments 2
Больше похоже на partial application, чем curry. //зануда мод
+1
(upd. сначала скопировал ошибочную версию, теперь верная, ссылка на плейграунд
Для начала хочу заметить, что вы решили более сложную задачу, чем просто каррирование :) Оригинал подразумевал превращение функции в "цепочку" функций одного аргумента, т.е. f(1, 2, 3) -> f(1)(2)(3)
, а вы сделали так, что можно вызывать сразу с несколькими.
Тем не менее, даже для этой задачи ваше решение кажется переусложненным. Проще всего, я думаю, было написать рекурсию с явными аккумуляторами A1 и A2, которыми перебирать все такие значения, что [...A1, ...A2] = Parameters<F>
:
type _Head<A extends any[]> = A extends [infer H, ...any[]] ? H : never;
type _Tail<A extends any[]> = A extends [any, ...infer T] ? T : never;
type _Recurse<F extends (...args: any[]) => any, A1 extends any[] = [], A2 extends any[] = Parameters<F>>
= A2 extends []
? F
: F extends (...a: [...A1, ...A2]) => infer R
? ((...a1: A1) => _Recurse<(...a2: A2) => R>) & (_Recurse<F, [...A1, _Head<A2>], _Tail<A2>>)
: never;
type Curry<F extends (...args: any[]) => any> = _Recurse<F>;
+2
Sign up to leave a comment.
Типизируй с нами, типизируй, как мы…