第二十七章 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>

相关推荐

  1. 第二 TypeScript TS用法infer

    2024-03-26 22:04:01       36 阅读
  2. Python-函数

    2024-03-26 22:04:01       22 阅读
  3. 第二:Docker Nginx 部署

    2024-03-26 22:04:01       35 阅读
  4. React 第二 Hook useMemo

    2024-03-26 22:04:01       37 阅读
  5. QML() ECMAScript 语法介绍

    2024-03-26 22:04:01       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 22:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 22:04:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 22:04:01       82 阅读
  4. Python语言-面向对象

    2024-03-26 22:04:01       91 阅读

热门阅读

  1. ubuntu 搭建 sonic v2.6.4 平台记录

    2024-03-26 22:04:01       33 阅读
  2. 【C++】6-2 交换函数2 分数 10

    2024-03-26 22:04:01       35 阅读
  3. ChatGPT秘籍:让ChatGPT帮你打造出色论文

    2024-03-26 22:04:01       39 阅读
  4. 解释器模式

    2024-03-26 22:04:01       35 阅读
  5. iptables笔记

    2024-03-26 22:04:01       35 阅读
  6. Vue中如何实现动态改变字体大小

    2024-03-26 22:04:01       42 阅读
  7. C++与C语言之间的区别

    2024-03-26 22:04:01       44 阅读
  8. JWT令牌

    JWT令牌

    2024-03-26 22:04:01      44 阅读
  9. 结构体-C语言

    2024-03-26 22:04:01       42 阅读
  10. Redis事务

    2024-03-26 22:04:01       39 阅读
  11. C语言每日一题(65)有效三角形的个数

    2024-03-26 22:04:01       45 阅读
  12. python 打包

    2024-03-26 22:04:01       40 阅读