获取数组元素的类型 普通函数的返回类型 Promise的返回类型 ()=>Promise的返回类型

获取数组元素的类型

1
2
3
type Unpacked<T> = T extends (infer U)[] ? U : T;
// type A = string
type A = Unpacked<string[]>

这段代码的意思是 判断T是不是数组类型 如果是则返回该数组元素的类型 否则返回T

普通函数的返回类型

1
2
3
type Unpacked<T> = T extends (...args: any[]) => infer U ? U : T;
// type B = number
type B = Unpacked<() => number>

这段代码的意思是 判断T是不是Function类型 如果是则返回Function return的类型 否则返回T

Promise的返回类型

1
2
3
type Unpacked<T> = T extends Promise<infer U> ? U : T;
// type C = number
type C = Unpacked<Promise<number>>

这段代码的意思是 判断T是不是Promise类型 如果是则返回Promise resolve的类型 否则返回T

()=> Promise的返回类型

1
2
3
type Unpacked<T> = T extends (...args: any[]) => Promise<infer U> ? U : T;
// type D = number
type D = Unpacked<Promise<number>>

这段代码的意思是 判断T是不是() => Promise类型 如果是则返回Promise resolve的类型 否则返回T

封装为一个通用工具类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type Unpacked<T> = T extends null | undefined
? T
: T extends (...args: any[]) => Promise<infer U>
? U
: T extends (infer U)[]
? U
: T extends Promise<infer U>
? U
: T extends (...args: any[]) => infer U
? U
: T;

// type A = string
type A = Unpacked<string[]>

// type B = number
type B = Unpacked<() => number>

// type C = number
type C = Unpacked<Promise<number>>

// type D = number
type D = Unpacked<Promise<number>>

注意事项

封装时一定要注意判断顺序 ()=> Promise , Promise 都属于Function 所以要先判断 ()=> Promise 然后是 Promise,再然后是普通 Function