本文主要是介绍第二十七章 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 : Ttype 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>
这篇关于第二十七章 TypeScript TS进阶用法infer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!