对柯里化进行类型标注
Code
ts
declare function curry();
function sum(a: number, b: number, c: number) {
return 123;
}
const curried = curry(sum);
const r = curried(2)(3)(4);
解析
ts
// 增加泛型
declare function curry<A extends any[], R>(fn: (...args: A) => R): Function;
/**
* 分析情况
* 1. () => R
* 2. (A) => R
* 3. (第一个参数类型) => 新的函数
*/
type Curried<A extends any[], R> = A extends []
? () => R
: A extends [infer P]
? (x: P) => R
: A extends [infer P, ...infer Rest]
? (x: P) => Curried<Rest, R>
: never;
declare function curry<A extends any[], R>(
fn: (...args: A) => R
): Curried<A, R>;