前言
由于现在工作使用的技术栈是 React、TypeScript 和 ahooks,工作中需要用到大量的类型定义,特此记录一下一些常用的 类型通用API
封装。
TS 内置类型
Partial<T>
:将 T
所有属性变为可选属性Required<T>
:将 T
所有属性变为必选属性Readonly<T>
:将 T
所有属性变为只读属性NonNullable<T>
:过滤 T
类型中的 null 及 undefined 类型Parameters<T>
:获取函数的参数类型,将每个参数类型放在一个元组中Omit<T, K>
:从类型 T
中剔除 K
中的所有属性Pick<T, K>
:从类型 T
中挑选 K
中的所有属性Exclude<T, U>
:提取存在于 T
,但不存在于 U
的类型组成的联合类型Extract<T, U>
:提取联合类型 T
和联合类型 U
的所有交集Record<T, K>
:构造一个具有一组属性 K
(类型 T
)的类型
TS 内置关键字
extends
:继承、泛型约束、条件类型infer
:这玩意我到现在都还没搞懂keyof
:将一个类型的属性名全部提取出来当做联合类型typeof
:在类型上下文中获取变量或者属性的类型in
:常用来遍历枚举类型
TS compiler 内部实现的类型
Uppercase
:构造一个将字符串转大写的类型Lowercase
:构造一个将字符串转小写的类型Capitalize
:构造一个将字符串首字符转大写的类型Uncapitalize
:构造一个将字符串首字符转大小写的类型
实现 Optional API,实现部分类型变为可选
| type Article = { |
| title: string; |
| content: string; |
| author: string; |
| date: Date; |
| readCount: number; |
| } |
| |
| // 实现 T 部分类型变为可选 |
| type Optional<T,K extends keyof T> = Omit<T,K> & Partial<Pick<T,K>>; |
| |
| type ArticleTodo = Optional<Article,'author' | 'date' | 'readCount'> |
| // { title: string; content: string; author?: string; date?: Date; readCount?: number; } |
实现 GetOptional API,获取类型中的所有可选字段
| type Article = { |
| title: string; |
| content: string; |
| author?: string; |
| date?: Date; |
| readCount?: number; |
| } |
| |
| |
| type GetOptional<T> = { |
| [P in keyof T as T[P] extends Required<T>[P] ? never : P]: T[P] |
| }; |
| |
| type ArticleTodo = GetOptional<Article> |
| |
实现 DeepReadonly API,实现不可变类型的深度遍历
| type Article = { |
| title: string; |
| name:{ |
| first:string; |
| lasr:string; |
| } |
| } |
| |
| |
| type DeepReadonly<T extends Record<string | symbol,any>> = { |
| readonly [k in keyof T]: DeepReadonly<T[K]>; |
| }; |
| |
| type ArticleTodo = DeepReadonly<Article> |
实现 UnionToIntersection API,将联合类型转为交叉类型
| type Article = { title:string } | { name:string } | { date: Date } |
| |
| |
| type UnionToIntersection<T> = |
| (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never; |
| |
| type ArticleTodo = UnionToIntersection<Article> |
| |
本篇文章会不间断更新。