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

简介: 这篇文章介绍了一些常用的类型通用API封装,包括TS内置类型和关键字的使用,以及TS compiler内部实现的类型。文章截取了一些常用的类型定义和API示例,如Partial、Required、Readonly、NonNullable、Parameters等。还介绍了一些常用的TS关键字,如extends、infer、keyof、typeof、in等。此外,文章还提供了一些实现示例,如Optional API、GetOptional API和UnionToIntersection API。该文章会不断更新。

前言

由于现在工作使用的技术栈是 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,实现部分类型变为可选

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;
}

// 获取 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,实现不可变类型的深度遍历

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,将联合类型转为交叉类型

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 }

{cat_tips_info color=""}本篇文章会不间断更新。{/cat_tips_info}

相关文章
|
安全 前端开发 物联网
现代 API 的类型划分
【2月更文挑战第28天】
|
监控 搜索推荐 数据挖掘
淘宝 API 接口的调用频率限制是否会因应用类型而异?
淘宝API调用频率限制依应用类型而异。电商管理类如商家后台、商品批量上传工具,调用频次较高;数据分析类如市场调研、店铺分析工具,频次较严;导购推荐类如第三方导购平台、社交媒体导购应用,依据规模与信誉设定;其他如开发者测试、个人小型应用则限制较宽松。
|
JSON 测试技术 API
API调用类型全面指南:理解基础知识
在数字化时代,API(应用程序编程接口)是连接不同软件应用的核心技术。掌握API调用类型对于开发高效、可扩展的系统至关重要。本文详细解析了GET、POST、PUT、DELETE等常见API请求方法,以及GraphQL、WebSocket等高级技术的应用场景。同时,介绍了APIPost这一强大工具如何优化API开发与测试流程。通过理解HTTP状态码、数据格式及请求头部信息,开发者能更好地设计和管理API,实现无缝跨平台通信。无论是数据获取、更新还是实时交互,合理选择API调用类型均可提升开发效率与用户体验。
|
XML 网络协议 API
从cURL到GraphQL:不同API类型概述
本文概述了不同API类型及其应用,帮助开发人员选择合适的工具。cURL是强大的命令行工具,适用于调试和自动化;RESTful API基于HTTP方法,适合Web服务和微服务架构;SOAP用于企业级应用,提供高安全性;GraphQL通过精确查询减少数据传输;WebSocket支持实时通信,适用于低延迟场景。了解这些API的特点和优势,有助于构建高效、可扩展的应用程序。
|
存储 程序员 API
【收藏】非API函数检测操作系统类型
【收藏】非API函数检测操作系统类型
|
JSON 关系型数据库 MySQL
这个问题是由于Flink的Table API在处理MySQL数据时,将MULTISET类型的字段转换为了JSON格式
【1月更文挑战第17天】【1月更文挑战第84篇】这个问题是由于Flink的Table API在处理MySQL数据时,将MULTISET类型的字段转换为了JSON格式
387 1
|
XML API 网络架构
API 常用的接口类型都有哪些?
在软件开发的宏大舞台上,接口充当着不可或缺的角色,确保了不同的软件模块能够高效、无缝地沟通和协作。
|
XML API 网络架构
API的类型及其区别是什么?
API的类型及其区别是什么?
1066 0
|
IDE 安全 Java
Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结
Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结
431 0
Java 版本、语言规范、API、JDK、IDE、Java 源程序编译、执行原理(跨平台性根本原因)、特殊字符用法、8 大数据类型小结