infer 是 TypeScript 中的一种高级类型操作符,用于在条件类型中推断类型。它通常与条件类型(Conditional Types)一起使用,用于从复杂类型中提取或推断出某个部分的类型。
infer 的基本语法
infer 关键字通常用于条件类型的 extends 子句中,表示在条件成立时推断出一个新的类型变量。
type InferType<T> = T extends infer U ? U : never;
在这个例子中,infer U 表示在 T 满足条件时,推断出一个新的类型变量 U。
infer 的使用场景
infer 关键字通常用于从复杂类型中提取或推断出某个部分的类型,例如函数参数、返回值、数组元素类型等。
1. 推断函数返回类型
infer 可以用于推断函数的返回类型。
示例
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
function greet(): string {
return "Hello, world!";
}
type GreetReturnType = ReturnType<typeof greet>; // string
在这个例子中,ReturnType 是一个条件类型,它使用 infer R 来推断函数 T 的返回类型 R。
2. 推断函数参数类型
infer 可以用于推断函数的参数类型。
示例
type Parameters<T> = T extends (...args: infer P) => any ? P : never;
function greet(name: string, age: number): string {
return `Hello, ${name}! You are ${age} years old.`;
}
type GreetParameters = Parameters<typeof greet>; // [string, number]
在这个例子中,Parameters 是一个条件类型,它使用 infer P 来推断函数 T 的参数类型 P。
3. 推断数组元素类型
infer 可以用于推断数组的元素类型。
示例
type ElementType<T> = T extends (infer U)[] ? U : never;
type Numbers = number[];
type NumberElement = ElementType<Numbers>; // number
在这个例子中,ElementType 是一个条件类型,它使用 infer U 来推断数组 T 的元素类型 U。
4. 推断 Promise 的解析类型
infer 可以用于推断 Promise 的解析类型。
示例
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type PromiseString = Promise<string>;
type StringType = UnwrapPromise<PromiseString>; // string
在这个例子中,UnwrapPromise 是一个条件类型,它使用 infer U 来推断 Promise<T> 的解析类型 U。
infer 的优势
- 类型推断:
infer 允许你在条件类型中推断出新的类型变量,使得类型操作更加灵活和强大。
- 代码重用:通过
infer,你可以创建通用的类型工具,用于提取或推断复杂类型中的部分类型。
- 类型安全:
infer 可以帮助你在编译时进行类型推断,确保类型安全。
总结
infer 是 TypeScript 中用于在条件类型中推断类型的关键字。它通常与条件类型一起使用,用于从复杂类型中提取或推断出某个部分的类型。理解 infer 的使用场景和语法,可以帮助你编写出更灵活和类型安全的代码。