# 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

# 案例

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

# 好文推荐