推荐答案
在 TypeScript 中,infer
关键字用于在条件类型中推断类型。它允许你在条件类型中声明一个类型变量,并在条件满足时推断出该类型变量的具体类型。infer
通常与条件类型结合使用,用于从复杂类型中提取出某个部分的类型。
示例代码
type ExtractReturnType<T> = T extends (...args: any[]) => infer R ? R : never; function foo(): number { return 42; } type FooReturnType = ExtractReturnType<typeof foo>; // number
在这个示例中,ExtractReturnType
是一个条件类型,它检查 T
是否是一个函数类型。如果是,则使用 infer R
推断出函数的返回类型 R
,并将其作为结果类型;否则返回 never
。
本题详细解读
1. infer
关键字的作用
infer
关键字用于在条件类型中声明一个类型变量,并在条件满足时推断出该类型变量的具体类型。它通常用于从复杂类型中提取出某个部分的类型。
2. 条件类型中的 infer
条件类型的语法为 T extends U ? X : Y
,其中 T
是待检查的类型,U
是目标类型,X
和 Y
分别是条件为真和假时的结果类型。infer
关键字可以在 U
中使用,用于声明一个类型变量,并在条件为真时推断出该类型变量的具体类型。
3. 使用 infer
提取函数返回类型
type ExtractReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
在这个例子中,ExtractReturnType
是一个条件类型,它检查 T
是否是一个函数类型。如果是,则使用 infer R
推断出函数的返回类型 R
,并将其作为结果类型;否则返回 never
。
4. 使用 infer
提取数组元素类型
type ExtractElementType<T> = T extends (infer U)[] ? U : never; type NumArray = number[]; type Num = ExtractElementType<NumArray>; // number
在这个例子中,ExtractElementType
是一个条件类型,它检查 T
是否是一个数组类型。如果是,则使用 infer U
推断出数组元素的类型 U
,并将其作为结果类型;否则返回 never
。
5. 使用 infer
提取 Promise 的解析类型
type ExtractPromiseType<T> = T extends Promise<infer U> ? U : never; type PromiseType = Promise<string>; type ResolvedType = ExtractPromiseType<PromiseType>; // string
在这个例子中,ExtractPromiseType
是一个条件类型,它检查 T
是否是一个 Promise
类型。如果是,则使用 infer U
推断出 Promise
解析后的类型 U
,并将其作为结果类型;否则返回 never
。
6. 总结
infer
关键字在条件类型中非常有用,它允许你从复杂类型中提取出某个部分的类型。通过结合条件类型和 infer
,你可以编写出更加灵活和强大的类型工具。