ts的【不】常用技巧和工具函数归档 您所在的位置:网站首页 typescript类型体操插件 ts的【不】常用技巧和工具函数归档

ts的【不】常用技巧和工具函数归档

2023-06-25 06:45| 来源: 网络整理| 查看: 265

【不】常用小技巧 1.获取数组元素类型: type ArryType = T[number] 2.克隆数组: type CloneArr = { [k in keyof T]: T[k] } 3.推导数组产生类似as const作用: values: readonly [...T] declare function PromiseAll(values: readonly [...T]): Promise 复制代码 4.字符串转换大写:使用内置的函数 Uppercase 5.判断是否是never:type IsNever = [T] extends [never] ? true : false 注意以下写法无法判断是否是never: ❌ type Test = T extends never ? true : false 但是直接使用字面量是成立的: ✅ never extends never ? true : false 复制代码 6.判断是否为{} 空对象 Record type IsEmptyObj = T extends Object ? keyof T extends never ? true : false : false 7.判断是否为联合类型

type IsUnion = T extends U ? [U] extends [T]? false : true :never

8.判断是具体的字符而不是string的方法 type IsStr = T extends string ? string extends T ? false : true : false type IsStr = T extends ${infer S} ? true : false 9.判断是否为纯数字字符串

type isNumberStr = T extends `${number}` ? true : false

10.快速复制对象:type cloneObj = Omit 11.去除联合类型中的undefined: type RemoveUndefined = [T] extends [undefined] ? T: Exclude 常见知识点 泛型(T)如果是never,内部直接使用 T extends xx 会直接返回never 常用工具函数 1. 设置对象所有值为never type SetKeyNever = { [x in K]?: never; }; 复制代码 2.多个属性相互互斥 /** * 多个属性相互互斥 */ export type JustOne = NonNullable< { [x in Y]: Pick & SetKeyNever; }[Y] >; 复制代码 3.联合类型转交叉 /** * 联合类型转交叉 */ export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( k: infer I, ) => void ? I : never; 复制代码 4.首字母大写 /** * 首字母大写 */ export type FirstLetterUppercase = T extends `${infer F}${infer A}` ? `${Uppercase}${A}` : T; 复制代码 5.删除末尾字符 /** * 删除末尾字符 * 1.serach last * 2.string to tuple and delete last item */ export type DeleteLastLetter< T extends string, O extends string = '', > = T extends `${infer F}${infer R}` ? (R extends '' ? O : DeleteLastLetter) : O; 复制代码 4.获取对象所有的key的完整路径 /** * 获取对象所有的key的完整路径 * {user: {name: string, age: number}, title: string} ===> 'user.name' | 'user.age' | 'title' */ type PickString = T extends string ? T : never; export type GetObjFullPaths = PickString< | keyof { [k in keyof T as T[k] extends Record ? never : k]: 1; } | keyof { [k in keyof T as k extends string ? T[k] extends Record ? `${k}.${GetObjFullPaths}` : never : never]: 1; } >; 复制代码


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有