✍️【TS类型体操进阶】挑战类型极限,成为类型魔法师!♂️✨
哈喽类型战士们!今天我们要玩转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声明文件全解析」,带你征服第三方库类型!🚀
相关文章:
✍️【TS类型体操进阶】挑战类型极限,成为类型魔法师!♂️✨
哈喽类型战士们!今天我们要玩转TS类型体操,让你的类型系统像体操运动员一样灵活优雅~ 学会这些绝招,保准你的代码类型稳如老狗!(文末附类型体操段位表)🚀 一、什么是类型体操? &…...
联邦学习图像分类实战:基于FATE与PyTorch的隐私保护机器学习系统构建指南
引言 在数据孤岛与隐私保护需求并存的今天,联邦学习(Federated Learning)作为分布式机器学习范式,为医疗影像分析、金融风控、智能交通等领域提供了创新解决方案。本文将基于FATE框架与PyTorch深度学习框架,详细阐述如…...

springboot 加载 tomcat 源码追踪
加载 TomcatServletWebServerFactory 从 SpringApplication.run()方法进入 进入到 refresh () 方法 选择实现类 ServletWebServerApplicationContext 进入到 AbstractApplicationContext onRefresh() 方法创建容器 找到加载bean 得到 webServer 实例 点击 get…...
AI实战笔记(1)AI 的 6 大核心方向 + 学习阶段路径
一、机器学习(ML) 目标:用数据“训练”模型,完成分类、回归、聚类等任务。 学习阶段: (1)基础数学:线性代数、概率统计、微积分(适度) (2…...

使用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 实现消息队列(1)(环境搭建) 什么是消息队列核心特点核心组件工作原理常见消息队列实现应用场景优缺点 项目配置开发环境技术选型 更换软件源安装一些工具安装epel 软件源安装 lrzsz 传输工具安装git安装 cmake安装…...
66、微服务保姆教程(九)微服务的高可用性
微服务的高可用性与扩展 服务的高可用性 集群搭建与负载均衡。服务的故障容错与自愈。分布式事务与一致性 分布式事务的挑战与解决方案。使用 RocketMQ 实现分布式事务。微服务的监控与可观测性 metrics 和日志的收集与分析。sentinel 的监控功能。容器化与云原生 将微服务部署…...

RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
概述: 本文主要描述了,如何在ubuntu-20.04操作系统上,编译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测试操作指南
备注: 1)测试时一定要接电池,否则外部RTC断电后无法工作导致测试失败; 2)如果连接了网络,系统会自动同步NTP时钟,所以需要关闭自动同步时钟。 关闭自动同步NTP时钟方法: 先查看是…...

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

【MySQL】数据库、数据表的基本操作
个人主页:Guiat 归属专栏: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的连接管理
三次握手 什么是三次握手? 1. 第一次握手(客户端 → 服务器) 客户端发送一个 SYN 报文,请求建立连接。 报文中包含一个初始序列号 SEQ x。 表示:我想和你建立连接,我的序列号是 x。 2. 第二次握手&a…...
DAMA第10章深度解析:参考数据与主数据管理的核心要义与实践指南
引言 在数字化转型的浪潮中,数据已成为企业的核心资产。然而,数据孤岛、冗余和不一致问题严重制约了数据价值的释放。DAMA(数据管理协会)提出的参考数据(Reference Data)与主数据(Master Data&…...

初识Linux · 传输层协议TCP · 下
目录 前言: 滑动窗口和流量控制机制 流量控制 滑动窗口 1.滑动窗口如何移动 2.滑动窗口的大小如何变化的 3.如果发生了丢包如何解决(快重传) 拥塞控制 延迟应答 面向字节流 RST PSH URG 什么是 PSH? 什么是 URG&…...
Kubernetes生产实战(十六):集群安全加固全攻略
Kubernetes集群安全加固全攻略:生产环境必备的12个关键策略 在容器化时代,Kubernetes已成为企业应用部署的核心基础设施。但根据CNCF 2023年云原生安全报告显示,75%的安全事件源于K8s配置错误。本文将基于生产环境实践,系统讲解集…...

什么是分布式光伏系统?屋顶分布式光伏如何并网?
政策窗口倒计时!分布式光伏如何破局而立? 2025年,中国分布式光伏行业迎来关键转折: ▸ "430"落幕——抢装潮收官,但考验才刚开始; ▸ "531"生死线——新增项目全面市场化交易启动&…...
YOLO 从入门到精通学习指南
一、引言 在计算机视觉领域,目标检测是一项至关重要的任务,其应用场景广泛,涵盖安防监控、自动驾驶、智能交通等众多领域。YOLO(You Only Look Once)作为目标检测领域的经典算法系列,以其高效、快速的特点受到了广泛的关注和应用。本学习指南将带领你从 YOLO 的基础概念…...
嵌入式硬件篇---麦克纳姆轮(简单运动实现)
文章目录 前言1. 麦克纳姆轮的基本布局X型布局O型布局 2. 运动模式实现原理(1) 前进/后退前进后退 (2) 左右平移向左平移向右平移 (3) 原地旋转顺时针旋转(右旋)逆时针旋转(左旋) (4) 斜向移动左上45移动 (5) 180旋转 3. 数学原理…...

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

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

Quorum协议原理与应用详解
一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议,通过权衡一致性(C)与可用性(A)实现数据冗余和最终一致性。其核心规则为: W(写成功副本数) …...

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

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

SPDK NVMe of RDMA 部署
使用SPDK NVMe of RDMA 实现多NVMe设备共享 一、编译、安装spdk 1.1、下载 1.1.1 下载spdk源码 首先,我们需要从GitHub上克隆SPDK的源码仓库。打开终端,输入以下命令: git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk1.1.2…...
《C++中插入位的函数实现及示例说明》
《C中插入位的函数实现及示例说明》 这个函数 insertBits 的作用是将整数 M 插入到整数 N 的指定位置区间 [i, j] 中。具体来说,函数会先清除 N 中从第 i 位到第 j 位的所有位,然后将 M 左移 i 位后与清除后的 N 相加,从而将 M 插入到 N 的指…...

【Redis】缓存和分布式锁
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、缓存(Cache) 概述 Redis最主要的应用场景便是作为缓存。缓存(Cache)是一种用于存储数据副本的技术或组件,…...
SDK游戏盾与高防ip的的区别
SDK游戏盾与高防IP是两种针对不同业务场景设计的网络安全防护方案,二者在技术原理、防护能力、应用场景及用户体验等方面存在显著差异。以下为具体对比分析: 一、技术原理与实现方式 高防IP 原理:通过DNS解析或BGP路由将流量牵引至高防机房…...

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

大模型微调指南之 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线性规划工具包),可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库,最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载,仅包含源码,最新版本为5.0。 GLPK是…...