# infer
在条件类型的 extends 子句中,现在可以有 infer 声明来引入要推断的类型变量。这种推断的类型变量可以在条件类型的真实分支中引用
注意:不能在常规类型参数的约束子句中使用推断声明.。比如下面错误案例
type ReturnType<T extends (...args: any[]) => infer R> = R; // Error, not supported
1
例如:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
上面的类型变量 R 只能在条件类型为true的时候能用,不能在false分支中使用
1
2
3
2
3
# 案例
type Unpacked<T> = T extends (infer U)[]
? U
: T extends (...args: any[]) => infer U
? U
: T extends Promise<infer U>
? U
: T;
type T0 = Unpacked<string>; // string
type T1 = Unpacked<string[]>; // string
type T2 = Unpacked<() => string>; // string
type T3 = Unpacked<Promise<string>>; // string
type T4 = Unpacked<Promise<string>[]>; // Promise<string>
type T5 = Unpacked<Unpacked<Promise<string>[]>>; // string
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13