在TypeScript中,infer是一个关键字,用于在条件类型(conditional types)中推断(infer)类型参数。通过使用infer关键字,我们可以在类型系统中进行类型的自动推断,从而实现更加灵活和可复用的类型定义。
infer关键字通常用于条件类型(conditional types)中,条件类型是TypeScript中的高级类型操作符之一。通过条件类型,我们可以根据某个类型的特性,在类型系统中进行条件分支和类型的变换。
在条件类型中使用infer关键字时,通常会将infer和extends关键字一起使用,下面是几个使用示例:
1. 使用infer关键字获取函数的返回值
其实ts已经给我们提供了ReturnType<T>类型工具,如果传入函数类型则返回函数的返回值类型,如下所示:
let r: ReturnType<() => number> // r的类型就是number
下面我们通过infer关键子也实现一个Return<T>类型工具,达到ReturnType<T>这样同样的效果
type Return<T> = T extends (...args: any[]) => infer U ? U : T
上面如果传入函数类型,则返回函数的返回值类型,否则返回传入的类型
2. 使用infer关键字获取数组元素的类型
type InferArray<T> = T extends Array<infer U> ? U : T
上面如果传入数组类型,则返回数组元素的类型,否则返回传入的类型
3. 使用infer关键字获取函数类型的第一个参数的类型
type FirstArg<T> = T extends (FirstArg: infer U, ...args: any[]) => void ? U : T
上面如果传入函数类型,则返回函数的第一个参数的类型,否则返回传入的类型
4. 使用infer关键字获取类型Person.name的类型
假设我们有一个类型infer,它包含名字和年龄两个属性
type Person = {
name: string;
age: number;
}
现在,我们希望从Person类型中提取出只包含名字的子类型。我们可以使用infer关键字来实现这个目标 :
type ExtractName<T> = T extends { name: infer U; age: number } ? U : never;
在上述示例中,ExtractName是一个条件类型,它根据传入的泛型类型T
是否满足{ name: infer U; age: number }
条件进行分支。如果满足条件,则返回infer U中推断的类型U
,即名字的类型;否则返回never类型。
我们可以使用ExtractName来提取Person类型中的名字:
type NameOnly = ExtractName<Person>; // 类型为 string
infer关键字是TypeScript中用于在条件类型中进行类型推断的重要工具。通过使用infer关键字,我们可以根据类型的特性,实现更加灵活和可复用的类型定义。这种类型推断的能力使得TypeScript能够更好地捕获和利用代码中的类型信息,提高开发效率和代码质量。