当前位置: 首页 > news >正文

ts体操训练

1 实现pick

type MyPick<T, K extends keyof T> = {[P in K]: T[P]
}

2 实现readonly

让interface中所有属性变为可读

type MyReadonly<T> = {readonly [K in keyof T]: T[K]
}

3 TupleToObject

将元组类型转换为对象类型

type tupleToObject<T extends any[]> ={[k in T[number]]: k
} 

4 取出数组的第一项

type First<T extends any[]> = T extends []? never: T[0]T["length"] extends 0 ? never : T[0]T[0] extends T[number]? never: T[0]T extends [ infer First, ...infer Rest]? First : never

5 实现Exclude

type MyExclude<T,U> = T extends U? never:T

6 实现includes

type includes<T extends readonly any[], U> = T extends [infer First, ...infer Rest] ? Equal<First,U> extends true ? true : inlcudes<Rest, U> : false

7 实现ReturnType

type MyReturnType<T> = T extends (...args:any) => infer R ? R : never  

8 构造链式对象

//例子
{name: '123',age: {same: true	}
}type Chainable<T = {}> = {option: <K extends string, V>(key: K extends T ? V extends T[K]? never : K : K, value: V) => Chainable<Omit<T,K> & Record<KV>>get: () => T
}

9 取数组最后一项

type Last<T extends any[]> = T extends [...infer Rest, infer L] ? L : never

10 去除字符串左边的空白

type Space = ' ' | '\n' | '\t'type TrimLeft<S extends string> = S extends `${Space}${infer R}` ? TrimLeft<R> : S

11 将首字母大写

type Capitalize<S extends string> = S extends `${infer x}${infer Rest}` ? `${UpperCase<X>}${Rest}` : S

12 替换匹配的第一个元素

type Replace<S extends string, From extends string, To extends string> = From extends ''? S : S extends `${infer V}${From}${infer R}` ? `${V}${To}${R}` : S

13 向函数中添加参数

type AppendArguments<Fn,A> = Fn extends (...args: infer R) => infer T ? (...args:[...R, A]) => T : never  

14 联合类型的全排列

type Permutation<T,K=T> = [T] extends [never] ? [] : K extends K ? [K, ...Permutation<Exclude<T,K>>] : never 

15 字符串的长度

type LengthOfString<S extends string, T extends string[] = []> = S extends `${infer L}${infer R}` ?  LengthOfString<R,[...T,R]> : T['length']

16 数组扁平化

type Flatten<T extends any[], U extends any[] = []> = T extends [infer L, ...infer Rest] ? L extends any[] ? Flatten<[...L,...Rest],U> : Flatten<[...Rest],[...U,L]> : U

17 向对象中添加元素

需要限定key的范围,对象的键名应为字符串或数字

type AddToObject<T,U extends keyof any,V> = {[K in keyof T | U] : K extends keyof T? T[K]:V
}

18

http://www.lryc.cn/news/61202.html

相关文章:

  • int指令
  • Cycling 74 Max for Mac:音乐可视化编程软件
  • ROS学习第十二节——话题通信控制小乌龟
  • matlab点云的可视化-源码复制粘贴即可(一)
  • 反射-Class类分析
  • Let’s Make C++ Great Again——string与常用字符处理函数
  • 〖Python网络爬虫实战⑰〗- 网页解析利器parsel实战
  • 中电金信:生成式AI热潮下,文本智能走向何方?
  • 探索Linux设备树:硬件描述与驱动程序的桥梁
  • UNION ALL用法 以及 UNION ALL和UNION的区别
  • Ubuntu Linux操作
  • MongoDB常用语句(CURD)
  • 一篇文章让你彻底学会--节流(并且自己可以手写)
  • C++ 形参是类的指针 class * 通过new的方式创建对象
  • 手把手教你将项目部署到服务器!
  • OpenHarmony应用开发-ArkUI方舟开发框架简析
  • 【Transformer系列(4)】Transformer模型结构超详细解读
  • Idea启动运行报错:Error:java: 无效的源发行版: 13
  • 【元分析研究方法】学习笔记1.形成问题
  • 2023年3月 青少年软件编程(Python) 等级考试试卷(五级)
  • 必须要知道的hive调优知识(上)
  • 什么是Cache Aside Pattern与延迟双删
  • frp 流量特征
  • Unity --- UGUI(Unity Graphical user interface)--- Canvas画布
  • c++积累6-内联函数
  • ESP32学习笔记13-MCPWM主要用于无刷电机驱动
  • MyBatis-plu 和 JPA 对比
  • 一文详解Python中多进程和进程池的使用方法
  • 前端部署发布项目后,如何通知用户刷新页面、清除缓存
  • 项目上线|慕尚集团携手盖雅工场,用数字化推动人效持续提升