# 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