infer
第二十七章 TypeScript 言简意赅 ,infer 就是推导泛型参数
infer 声明只能出现在 extends 子语句中
infer 后面跟一个变量名
获取 promise 返回的参数
interface User{
name: string;
age:number
}
type PromiseType = Promise< Promise< Promise<User>>>
// type PromiseType = Promise<User>
type GetPromiseType<T> = T extends Promise<infer U> ? GetPromiseType<U> : T
type T = GetPromiseType<PromiseType>
infer 协变
产生协变会返回联合类型
let obj = {
naem: 'heming',
age: 18
}
// type Bar<T> = T extends { name: infer N, age: infer A } ? [N, A] : T
type Bar<T> = T extends { name: infer U, age: infer U } ? U : T
type T = Bar<typeof obj>
infer 逆变 出现在函数的参数上面
逆变返回的是交叉类型
type a = number & string 返回 never
type Bar<T> = T extends {
a: (x: infer U) => void,
b: (x: infer U) => void
} ? U : 'afiaohgo'
type T = Bar<{ a: (x: number) => void, b: (x: number) => void }>
infer 提取参数的妙用 实现四个简单的例子
1.提取头部元素
类型参数 T 通过extends 约束 只能是数组类型,然后通过infer 声明局部 First 变量做提取,后面的元素可以是任意类型,然后把局部变量返回
type Arr = ['a','b','c']
type First<T extends any[]> = T extends [infer First,...any[]] ? First : []
type a = First<Arr>
2.提取尾部元素
其实就是反过来就可以了
type Arr = ['a', 'b', 'c']
type Last<T extends any[]> = T extends [...any[], infer Last,] ? Last : []
type c = Last<Arr>
3.剔除第一个元素 Shift
思路就是 我们除了第一个的元素把其他的剩余元素声明成一个变量 直接返回 就实现了我们的要求 剔除第一个元素
type Arr = ['a','b','c']
type First<T extends any[]> = T extends [unknown,...infer Rest] ? Rest : []
type a = First<Arr>
4.剔除尾部元素 pop
type Arr = ['a','b','c']
type First<T extends any[]> = T extends [...infer Rest,unknown] ? Rest : []
type a = First<Arr>