在 TypeScript 中,infer
关键字用于在条件类型中推断类型。它允许你在条件类型中声明一个类型变量并推断它的类型,通常用来提取或推断复杂类型的内部结构。
使用 infer
关键字
infer
关键字只能在条件类型中使用,并用于声明一个局部的类型变量,该变量的类型由条件类型的条件部分推断得出。它主要用于提取和操作类型的内部细节。
基本语法
type ConditionalType<T> = T extends SomeType<infer U> ? U : FallbackType;
SomeType<infer U>
:在条件类型的条件部分,SomeType
是一个带有类型参数的类型,U
是我们要推断的类型变量。
U
:被推断的类型变量,可以在条件为 true
时使用。
FallbackType
:当条件为 false
时的备用类型。
示例
示例 1:推断数组的元素类型
type ElementType<T> = T extends (infer U)[] ? U : never;
type NumberArray = ElementType<number[]>; // number
type StringArray = ElementType<string[]>; // string
type NotArray = ElementType<number>; // never
在这个例子中:
ElementType
用于提取数组类型中的元素类型。
- 对于
number[]
类型,ElementType<number[]>
推断出元素类型是 number
。
- 对于
string[]
类型,ElementType<string[]>
推断出元素类型是 string
。
- 对于非数组类型,
ElementType<number>
的结果是 never
。
示例 2:推断函数的返回类型
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type Func = () => string;
type Result = ReturnType<Func>; // string
在这个例子中:
ReturnType
用于推断函数类型的返回值类型。
- 对于函数
() => string
,ReturnType<Func>
推断出返回值类型是 string
。
示例 3:推断 Promise 的解析类型
type PromiseType<T> = T extends Promise<infer U> ? U : never;
type StringPromise = PromiseType<Promise<string>>; // string
type NumberPromise = PromiseType<Promise<number>>; // number
type NotPromise = PromiseType<number>; // never
在这个例子中:
PromiseType
用于提取 Promise
的解析类型。
- 对于
Promise<string>
,PromiseType<Promise<string>>
推断出解析类型是 string
。
- 对于非
Promise
类型,PromiseType<number>
的结果是 never
。