第二十七章 TypeScript TS进阶用法infer

 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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值