Skip to content

对柯里化进行类型标注

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>;