ts的【不】常用技巧和工具函数归档 | 您所在的位置:网站首页 › typescript类型体操插件 › ts的【不】常用技巧和工具函数归档 |
【不】常用小技巧
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 实验室设备网 版权所有 |