前言
由于现在工作使用的技术栈是 React、TypeScript 和 ahooks,工作中需要用到大量的类型定义,特此记录一下一些常用的 类型通用API 封装。
TS 内置类型
Partial
Required
Readonly
NonNullable
Parameters
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,实现部分类型变为可选
ts 代码: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,获取类型中的所有可选字段
ts 代码:type Article = {
title: string;
content: string;
author?: string;
date?: Date;
readCount?: number;
}
// 获取 T 类型中的所有可选字段
type GetOptional<T> = {
[P in keyof T as T[P] extends Required<T>[P] ? never : P]: T[P]
};
type ArticleTodo = GetOptional<Article>
// { author?: string; date?: Date; readCount?: number; }
实现 DeepReadonly API,实现不可变类型的深度遍历
ts 代码:type Article = {
title: string;
name:{
first:string;
lasr:string;
}
}
// API,实现不可变类型的深度遍历
type DeepReadonly<T extends Record<string | symbol,any>> = {
readonly [k in keyof T]: DeepReadonly<T[K]>;
};
type ArticleTodo = DeepReadonly<Article>
实现 UnionToIntersection API,将联合类型转为交叉类型
ts 代码:type Article = { title:string } | { name:string } | { date: Date }
// API,将联合类型转为交叉类型
type UnionToIntersection<T> =
(T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
type ArticleTodo = UnionToIntersection<Article>
// { title:string } & { name:string } & { date: Date }
本篇文章会不间断更新。
咋图标都加载失败了
暂无点赞