Appearance
递归类型推断
题目
ts
namespace Question {
declare function curry(obj: Function): Function;
function sum(a: number, b: number, c: number) {
return a + b + c;
}
const currySum = curry(sum);
currySum(1)(2)(3); // 6
}
namespace Question {
declare function curry(obj: Function): Function;
function sum(a: number, b: number, c: number) {
return a + b + c;
}
const currySum = curry(sum);
currySum(1)(2)(3); // 6
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
解法
ts
namespace Answer {
/**
* Curried 有以下几种情况
* 1. () => R
* 2. (x) => R
* 3. (x) => 新的函数
*/
type Curried<A, R> = A extends []
? () => R
: A extends [infer ARG]
? (param: ARG) => R
: A extends [infer ARG, ...infer REST]
? (param: ARG) => Curried<REST, R>
: never;
/**
* A 表示入参类型
* R 表示返回类型
*/
declare function curry<A extends any[], R>(
fn: (...args: A) => R
): Curried<A, R>;
function sum(a: number, b: string, c: object) {
return 123;
}
const currySum = curry(sum);
currySum(1)("abc")({}); // 6
}
namespace Answer {
/**
* Curried 有以下几种情况
* 1. () => R
* 2. (x) => R
* 3. (x) => 新的函数
*/
type Curried<A, R> = A extends []
? () => R
: A extends [infer ARG]
? (param: ARG) => R
: A extends [infer ARG, ...infer REST]
? (param: ARG) => Curried<REST, R>
: never;
/**
* A 表示入参类型
* R 表示返回类型
*/
declare function curry<A extends any[], R>(
fn: (...args: A) => R
): Curried<A, R>;
function sum(a: number, b: string, c: object) {
return 123;
}
const currySum = curry(sum);
currySum(1)("abc")({}); // 6
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31