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
的使用场景和语法,可以帮助你编写出更灵活和类型安全的代码。