✍️【TS类型体操进阶】挑战类型极限,成为类型魔法师!♂️✨

news2025/5/11 15:21:24

哈喽类型战士们!今天我们要玩转TS类型体操,让你的类型系统像体操运动员一样灵活优雅~ 学会这些绝招,保准你的代码类型稳如老狗!(文末附类型体操段位表)🚀


一、什么是类型体操?

🧩 通俗理解:用类型写"代码"

就像用积木搭建复杂建筑,用基础类型组合出神奇的类型结构!

⚙️ 核心装备:

条件类型(类型界的if/else)
映射类型(类型复印机)
模板字面量(字符串类型魔法)
递归类型(类型永动机)


二、六大高阶技巧揭秘

1️⃣ 字符串模板类型 —— 类型界的PS
type HttpMethod = 'GET' | 'POST'  
type ApiPath = `/api/${string}`  

const path: ApiPath = '/api/user'  // ✅  
const errorPath: ApiPath = '/user' // ❌  

实战场景

  • 路由路径校验
  • CSS类名规范

2️⃣ 递归类型 —— 类型"套娃"
// 实现树形结构类型  
type TreeNode<T> = {  
  value: T  
  children?: TreeNode<T>[]  
}  

const tree: TreeNode<string> = {  
  value: 'root',  
  children: [{ value: 'leaf' }]  
}  

应用场景

  • 无限级菜单
  • 组织架构树

3️⃣ 类型推断(infer)进阶 —— 类型侦探
// 提取函数返回值类型  
type GetReturnType<T> = T extends (...args: any) => infer R ? R : never  

type A = GetReturnType<() => string>  // string  
type B = GetReturnType<number>        // never  

破案技巧

  • 提取数组元素类型
  • 解构Promise返回值

4️⃣ 分布式条件类型 —— 类型分身术
type ToArray<T> = T extends any ? T[] : never  

type StrArr = ToArray<string | number>  // string[] | number[]  

原理揭秘
当T是联合类型时,条件类型会分布式执行


5️⃣ 类型映射2.0 —— 深度改造
// 递归将所有属性变为只读  
type DeepReadonly<T> = {  
  readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P]  
}  

type User = {  
  name: string  
  info: { age: number }  
}  

type ReadonlyUser = DeepReadonly<User>  
/*  
{  
  readonly name: string  
  readonly info: {  
    readonly age: number  
  }  
}  
*/  

6️⃣ 类型编程实战 —— 实现内置工具
// 手写Partial  
type MyPartial<T> = {  
  [P in keyof T]?: T[P]  
}  

// 手写Exclude  
type MyExclude<T, U> = T extends U ? never : T  

进阶挑战

  • 实现Omit
  • 实现NonNullable

三、Vue3中的类型体操实战

1️⃣ 组件Props类型推导
// 自动提取Props类型  
const props = defineProps<{  
  id: number  
  name: string  
}>()  

type PropsType = typeof props  // { id: number; name: string }  
2️⃣ 组合式函数类型增强
// 带自动类型推断的useState  
function useState<T>(initial: T) {  
  const state = ref(initial)  
  const setState = (value: T) => state.value = value  
  return [state, setState] as const  
}  

const [count, setCount] = useState(0)  // 自动推断number类型  

四、类型体操段位表

段位掌握技能示例场景
青铜基础泛型、接口函数参数类型约束
白银条件类型、映射类型表单校验类型
黄金模板字面量、类型推断API路径校验
钻石递归类型、分布式条件树形结构类型
王者类型编程、模拟内置工具实现复杂工具类型

五、常见问题QA

Q:类型体操有什么用?
A:提升代码健壮性、实现智能提示、规范团队协作

Q:类型写太复杂会不会影响性能?
A:类型只在编译时存在,不影响运行时性能

Q:如何调试复杂类型?
A:使用type Debug<T> = { [K in keyof T]: T[K] }展开类型


六、学习资源推荐

📚 TypeScript官方文档
🎮 Type Challenges 类型题库
🔧 TypeScript Playground 在线实验室


掌握类型体操,你就是团队里的"类型魔法师"!🧙♂️ 从今天开始,让你的代码既有钢铁般的类型检查,又有艺术家般的优雅~ 下期预告「TS声明文件全解析」,带你征服第三方库类型!🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot 加载 tomcat 源码追踪

加载 TomcatServletWebServerFactory 从 SpringApplication.run(&#xff09;方法进入 进入到 refresh () 方法 选择实现类 ServletWebServerApplicationContext 进入到 AbstractApplicationContext onRefresh() 方法创建容器 找到加载bean 得到 webServer 实例 点击 get…

使用countDownLatch导致的线程安全问题,线程不安全的List-ArrayList,线程安全的List-CopyOnWriteArrayList

示例代码 package com.example.demo.service;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class UnSafeCDTest {Executor…

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

C - 仿 RabbitMQ 实现消息队列&#xff08;1&#xff09;&#xff08;环境搭建&#xff09; 什么是消息队列核心特点核心组件工作原理常见消息队列实现应用场景优缺点 项目配置开发环境技术选型 更换软件源安装一些工具安装epel 软件源安装 lrzsz 传输工具安装git安装 cmake安装…

RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译

概述: 本文主要描述了&#xff0c;如何在ubuntu-20.04操作系统上&#xff0c;编译RK3568平台的OpenHarmony 5.1版本。 搭建编译环境 a. 安装软件包 sudo apt-get install git-lfs ruby genext2fs build-essential git curl libncurses5-dev libncursesw5-dev openjdk-11-jd…

eFish-SBC-RK3576工控板外部RTC测试操作指南

备注&#xff1a; 1&#xff09;测试时一定要接电池&#xff0c;否则外部RTC断电后无法工作导致测试失败&#xff1b; 2&#xff09;如果连接了网络&#xff0c;系统会自动同步NTP时钟&#xff0c;所以需要关闭自动同步时钟。 关闭自动同步NTP时钟方法&#xff1a; 先查看是…

vue3的深入组件-组件 v-model

组件 v-model 基本用法​ v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 defineModel() 宏&#xff1a; <script setup> const model defineModel()function update() {model.value } </script><template>…

【MySQL】数据库、数据表的基本操作

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. MySQL基础命令1.1 连接MySQL1.2 基本命令概览 2. 数据库操作2.1 创建数据库2.2 查看数据库2.3 选择数据库2.4 修改数据库2.5 删除数据库2.6 数据库备份与恢复 3. 表操作基础3.1 创建表3.2 查看表信息3.3 创建…

TCP的连接管理

三次握手 什么是三次握手&#xff1f; 1. 第一次握手&#xff08;客户端 → 服务器&#xff09; 客户端发送一个 SYN 报文&#xff0c;请求建立连接。 报文中包含一个初始序列号 SEQ x。 表示&#xff1a;我想和你建立连接&#xff0c;我的序列号是 x。 2. 第二次握手&a…

初识Linux · 传输层协议TCP · 下

目录 前言&#xff1a; 滑动窗口和流量控制机制 流量控制 滑动窗口 1.滑动窗口如何移动 2.滑动窗口的大小如何变化的 3.如果发生了丢包如何解决&#xff08;快重传&#xff09; 拥塞控制 延迟应答 面向字节流 RST PSH URG 什么是 PSH&#xff1f; 什么是 URG&…

什么是分布式光伏系统?屋顶分布式光伏如何并网?

政策窗口倒计时&#xff01;分布式光伏如何破局而立&#xff1f; 2025年&#xff0c;中国分布式光伏行业迎来关键转折&#xff1a; ▸ "430"落幕——抢装潮收官&#xff0c;但考验才刚开始&#xff1b; ▸ "531"生死线——新增项目全面市场化交易启动&…

完整进行一次共线性分析

&#xff08;随便找个基因家族&#xff09; 1.数据收集 使用水稻、拟南芥、玉米三种作物进行示例 可以直接去ensemble去找最标准的基因组fasta文件和gff文件。 2.预处理数据 这里对于fasta和gff数据看情况要不要过滤掉线粒体叶绿体的基因&#xff0c;数据差异非常大&#…

RabbitMQ--基础篇

RabbitMQ 简介&#xff1a;RabbitMQ 是一种开源的消息队列中间件&#xff0c;你可以把它想象成一个高效的“邮局”。它专门负责在不同应用程序之间传递消息&#xff0c;让系统各部分能松耦合地协作 优势&#xff1a; 异步处理&#xff1a;比如用户注册后&#xff0c;主程序将发…

Quorum协议原理与应用详解

一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议&#xff0c;通过权衡一致性&#xff08;C&#xff09;与可用性&#xff08;A&#xff09;实现数据冗余和最终一致性。其核心规则为&#xff1a; W&#xff08;写成功副本数&#xff09; …

vue搭建+element引入

vue搭建element 在使用Vue.js开发项目时&#xff0c;经常会选择使用Element UI作为UI框架&#xff0c;因为它提供了丰富的组件和良好的设计&#xff0c;可以大大提高开发效率。以下是如何在Vue项目中集成Element UI的步骤&#xff1a; 1. 创建Vue项目 如果你还没有创建Vue项…

食物数据分析系统vue+flask

食物数据分析系统 项目概述 食物数据分析系统是一个集食物营养成分查询、对比分析和数据可视化于一体的Web应用。系统采用前后端分离架构&#xff0c;为用户提供食物营养信息检索、食物对比和营养分析等功能&#xff0c;帮助用户了解食物的营养成分&#xff0c;做出更健康的饮…

SPDK NVMe of RDMA 部署

使用SPDK NVMe of RDMA 实现多NVMe设备共享 一、编译、安装spdk 1.1、下载 1.1.1 下载spdk源码 首先&#xff0c;我们需要从GitHub上克隆SPDK的源码仓库。打开终端&#xff0c;输入以下命令&#xff1a; git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk1.1.2…

【Redis】缓存和分布式锁

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、缓存&#xff08;Cache&#xff09; 概述 Redis最主要的应用场景便是作为缓存。缓存&#xff08;Cache&#xff09;是一种用于存储数据副本的技术或组件&#xff0c;…

OpenLayers 精确经过三个点的曲线绘制

OpenLayers 精确经过三个点的曲线绘制 根据您的需求&#xff0c;我将提供一个使用 OpenLayers 绘制精确经过三个指定点的曲线解决方案。对于三个点的情况&#xff0c;我们可以使用 二次贝塞尔曲线 或 三次样条插值&#xff0c;确保曲线精确通过所有控制点。 实现方案 下面是…

大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调

文章目录 一、简介二、如何安装2.1 安装2.2 校验 三、开始使用3.1 可视化界面3.2 使用命令行3.2.1 模型微调训练3.2.2 模型合并3.2.3 模型推理3.2.4 模型评估 四、高级功能4.1 分布训练4.2 DeepSpeed4.2.1 单机多卡4.2.2 多机多卡 五、日志分析 一、简介 LLaMA-Factory 是一个…

GLPK(GNU线性规划工具包)介绍

GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包)&#xff0c;可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库&#xff0c;最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载&#xff0c;仅包含源码&#xff0c;最新版本为5.0。 GLPK是…