# Infer
- 一般用于获取泛型的类型
提示
只能用在 extends 关键字后面,推倒的类型只能用在 extends 判断位置的位置
// 通过 infer 缓存的泛型类型 只能在true分支中使用
// 自定义类型 Infer
type Infer<T> = T extends Prmoise<(infer U)> ? U : T
type string: Infer<Promise<string>> = 'xxx' // string
// 还可以递归
type Infer2<T> = T extends Promise<(infer U)> ? Infer2<U> : T
# 示例
# 元祖或者数组类型
type Head<T> = T extends [infer U, ...any[]] ? U : never
type h = Head<[number, string, boolean]> // number
type Split<T> = T extends [number, ...[infer U]] ? U : never
type s = Split<[number, string, boolean]> // string | boolean
# 对象类型
type V<T> = T extends { a: infer U } ? U : never
type a = V<{ a: 1, b: 2 }> // 1
type KV<T> = T extends { [k in infer U]: any } ? U : never
type b = KV<{ a: 1, b: 2 }> // 'a' | 'b'
# 函数类型
type Arg<T> = T extends (infer u) => any ? U : never
type a = Arg<(key: numer) => void> // number
type Return<T> = T extends (...args: any[]) => infer U ? U : never
type a = Arg<(key: numer) => string> // string