前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TS 中的类型验算,高级通用 API 实现

TS 中的类型验算,高级通用 API 实现

原创
作者头像
白雾茫茫丶
发布2024-05-22 15:42:23
1340
发布2024-05-22 15:42:23
举报
文章被收录于专栏:前端开发前端开发

前言

由于现在工作使用的技术栈是 ReactTypeScriptahooks,工作中需要用到大量的类型定义,特此记录一下一些常用的 类型通用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,实现部分类型变为可选

代码语言: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 }

本篇文章会不间断更新。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • TS 内置类型
  • TS 内置关键字
  • TS compiler 内部实现的类型
  • 实现 Optional API,实现部分类型变为可选
  • 实现 GetOptional API,获取类型中的所有可选字段
  • 实现 DeepReadonly API,实现不可变类型的深度遍历
  • 实现 UnionToIntersection API,将联合类型转为交叉类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档