Typescript高级: 深入理解交叉类型与联合类型

TS学习笔记六:高级类型/Symbols 本节介绍ts中的高级类型及Symbols相关内容,高级类型包括交叉类型、联合类型、类型保护、类型别名等内容,Symbols是ECMAScript 2015后的原生类型,像其他的基础类型number和string一样,通过Symbol构造函数创建,Symbol是不可改变且唯一的。 阅读详情

概述

  • 在TypeScript这一强大的类型系统中,开发者可以利用交叉类型(Intersection Types)和联合类型(Union Types)来设计复杂且灵活的类型结构,从而增强代码的类型安全性与表达能力
  • 本文将深入探讨这两种类型的特点、应用场景,并通过实际示例,展示如何在objtype1 & objtype2 & objtype3与objtype1 | objtype2中运用它们

交叉类型(Intersection Types)

  • 交叉类型,是将多个类型合并成一个新类型,这个新类型拥有所有输入类型的所有属性和方法

  • 使用符号 & 来定义交叉类型,它类似于数学中的“并集”的概念

  • 在TS中,当你需要一个对象同时满足多个类型要求时,交叉类型就显得尤为重要

    type type1 = { username: string, age: number };
    type type2 = { custname: string, phone: number, age: number };
    type type3 = { address: string };
    
    // type1 & type2 & type3 结果类型拥有三个类型的全部属性
    const xx: type1 & type2 & type3 = {
      username: "wangwu", 
      age: 23, 
      custname: "lisi", 
      phone: 111, 
      address: "shanghai"
    };
    
  • 在这个例子中,xx 需要同时包含 type1 、 type2 、 type3 的所有属性

  • 即用户名、年龄、客户名、电话号码和地址,这在设计复合对象模型时非常有用

  • 尤其是处理具有多重身份或角色的实体时

联合类型(Union Types)

  • 与交叉类型相对,联合类型通过符号|表示,允许一个值为多种类型中的任意一种

  • 它代表了“或”的关系,一个变量可以是多个类型中的任何一个,但在任一时间点只能是其中一个类型的具体实例

  • 联合类型在处理不确定类型或需要根据上下文推断类型的情况时非常有用

    type type1 = { username: string, age: number };
    type type2 = { custname: string, phone: number, age: number };
    
    const unionObject: type1 | type2 = {
        username: "wangwu", // 有效,因为type1中存在此属性
        age: 23, // 有效,两个类型中都有此属性
        custname: "lisi", // 有效,虽然type1中没有,但type2中有
        phone: 111 // 有效,同上,仅存在于type2中
    };
    
    // 注意:访问非共享属性时需要类型断言或类型守卫
    if ('custname' in unionObject) {
        console.log(unionObject.custname); // lisi
    }
    
  • 在这个例子中,unionObject可以是objtype1或objtype2的实例

  • 因此它可能包含username、age、custname和phone中的任意组合

  • 处理联合类型时,需要注意只有共享属性可以直接访问

  • 非共享属性访问前需进行类型检查或类型断言

两者区别


1 ) 赋值区别

  • 对于对象类型合成的交叉类型是多个类型属性和方法的合并后的类型,属于多个类型的并集,必须是两个类型的全部属性和方法才能赋值给交叉类型变量【可选属性和方法除外】
  • 对于对象类型合成的联合类型变量可以接受联合类型中任意一种数据类型全部属性和方法,也可以是两个类型的全部属性和全部方法【可选属性和方法除外】,也可以是一种数据类型全部属性和方法+其他类型的某个属性和某个方法

2 )获取属性和方法区别

  • 交叉类型变量可以获取两个类型的任意属性和任意方法
  • 而联合类型的变量只能获取两个类型的共同属性和方法【交集属性和交集方法】

应用场景对比

1 )交叉类型最适合于构建具有复合功能的对象

  • 比如一个类可能需要同时具备多个接口的特性,或者一个对象需要承载不同维度的数据结构
  • 比如:我们把用户信息,用户角色信息合并成一个对象然后输出,当然后端可以通过连接查询的 SQL 语句来完成到前端的多对象输出,但大多需要表的外键来支持,比如用户和角色就需要角色表有用户外键
  • 对于现实生活中有必须关联在一起的实体【比如商品和库存信息】一般建议数据表用外键来支持前端多个对象的合并输出,虽然影响了效率,但也保证了表的数据合理性和完整性
  • 但如果我们临时需要随机把两个根本没有外键关联的数据表取出来的对象合并在一起输出
  • 比如用户信息和日志信息,商品信息和日志信息,订单信息和日志信息,我们就可以用交叉类型来完成
  • 因为我们不可能为了这个临时的对象合并需求把所有的这些表都建立起外键
  • 须知外键太多不仅增加了数据表维护的负担,而且也有较大的影响了表操作效率

2 )联合类型则在处理函数参数的多态性、变量可能的多种类型
* 以及不确定具体类型但需根据运行时上下文确定的场景中大放异彩
* 通过深入理解并灵活运用交叉类型和联合类型

  • 开发者可以在TypeScript项目中实现更高级的类型设计,提高代码的健壮性和可维护性
  • 无论是处理复杂的业务逻辑,还是设计高度灵活的API,这两种类型机制都是不可或缺的工具

综合应用


1 )应用场景

  • 设想一个场景,你需要在前端项目中处理按钮(Button)、链接(Link)和跳转目标(Href)的信息,每个对象携带不同的属性
  • 目标是创建一个泛型函数,能够合并任意数量的这些对象,生成一个包含所有输入对象属性的交叉类型对象,以支持更灵活的配置和数据处理

2 ) 技术要点

  • 泛型函数(Generic Functions):允许函数参数和返回值的类型作为参数,从而增加函数的通用性和灵活性
  • 交叉类型(Intersection Types):通过&操作符将多个类型合并,生成一个新类型,该类型包含所有输入类型的属性和方法
  • 泛型约束(Generic Constraints):通过extends关键字限制泛型参数必须满足的类型条件,保证类型安全

3 ) 首先,定义基础接口和枚举类型

interface Button {
  btntype: string;
  text: string;
}

interface Link {
  alt: string;
  href: string;
}

interface Href {
  linktype: string;
  target: OpenLocation;
}

enum OpenLocation {
  Self = 0,
  Blank = '_blank',
  Parent = 'parent',
}

4 ) 定义对象实例

const button: Button = {
  btntype: 'primary',
  text: '点击跳转',
};

const link: Link = {
  alt: '访问Google',
  href: 'https://www.google.com',
};

const href: Href = {
  linktype: 'External',
  target: OpenLocation.Blank,
};

5 ) 实现泛型交叉函数cross,它接受多个对象参数并返回它们的交叉类型

type Union = Record<string, any>; // 为了简化理解,定义一个泛型约束,任何对象类型

function cross<T extends Union, U extends Union, V extends Union>(
  objOne: T, 
  objTwo: U, 
  objThree?: V
): T & U & V {
  const combined = {} as T & U;

  // 合并objOne的属性
  Object.keys(objOne).forEach(key => {
    combined[key] = objOne[key];
  });

  // 合并objTwo的属性,避免覆盖已存在的键
  Object.keys(objTwo).forEach(key => {
    if (!combined.hasOwnProperty(key)) {
      combined[key] = objTwo[key];
    }
  });

  // 如果有第三个对象,则继续合并
  if (objThree) {
    const finalCombined = combined as T & U & V;
    Object.keys(objThree).forEach(key => {
      if (!finalCombined.hasOwnProperty(key)) {
        finalCombined[key] = objThree[key];
      }
    });
    return finalCombined;
  }

  return combined;
}

// 两个对象交叉
const combinedTwo = cross(button, link);
console.log(combinedTwo);

// 三个对象交叉
const combinedThree = cross(button, link, href);
console.log(combinedThree);

总结

  • 泛型函数:cross<T, U, V>定义了三个泛型参数,代表输入对象的类型。通过泛型,函数可以处理不同类型的对象而无需明确指定具体类型
  • 交叉类型:通过T & U & V,函数返回的类型是输入对象类型的交叉,这意味着返回的对象包含了所有输入对象的属性
  • 泛型约束:虽然示例中未直接使用extends语法进行泛型约束,但通过Union类型间接确保了传入的对象至少是某种对象类型,维持了类型安全
  • 通过此示例,泛型函数和交叉类型实现灵活的数据合并, 在泛型中加入约束来保证类型的安全性
  • 这不仅提升了代码的复用性和可维护性,也为复杂逻辑处理提供了强有力的类型保障
深入理解 TypeScript 中的联合类型与交叉类型 TypeScript 作为 JavaScript 的超集,其最强大的特性之一就是静态类型系统。在 TypeScript 的类型系统中,联合类型(Union Types)和交叉类型(Intersection Types)是两个极其重要且实用的概念。 阅读详情

相关推荐

37-TS之交叉和联合类型

本文深入解析TypeScript中的交叉类型(&)和联合类型(|)的使用方法。交叉类型通过合并多个类型实现属性叠加,常用于对象混入和接口组合;联合类型则允许变量在多种类型间切换,适用于动态值处理。文章通过代码示例详细展示了两种类型的基本用法、应用场景和注意事项,并提供了类型守卫、类型嵌套等进阶技巧。合理使用这两种类型能有效提升代码的健壮性和可维护性,帮助开发者在复杂业务中更高效地运用TypeScript类型系统。

yzc008的博客 6683

读懂 TS 中联合类型和交叉类型的含义

创建了一个 “重学TypeScript” 的微信群,想加群的小伙伴,加我微信 "semlinker",备注重学TS。本文是 ”重学TS系列“ 第 28 篇文章,感谢您的阅...

azl397985856的专栏 1万+

TypeScript联合与交叉类型:深入理解类型组合

本文将深入探讨TypeScript中的联合类型和交叉类型,解释它们如何共同决定复杂类型的行为。我们将通过属性签名、索引签名、调用签名和构造签名,来理解联合类型如何继承成员类型中的类型成员,并且探讨交叉类型如何合并多个类型成员以及它们的顺序如何影响最终的类型。

weixin_36074800的博客 774

TypeScript基础知识(五)联合类型和交叉类型

TypeScript 的交叉类型(Intersection Types)是将多个类型合并为一个新的类型的一种方式。通过交叉类型,可以创建一个包含了多个类型特性的类型。需要注意的是,当我们在使用联合类型的值时,需要进行类型检查和类型保护。联合类型(Union Types)是 TypeScript 中的一种高级类型,它允许一个变量可以存储多种类型的值。通过使用交叉类型,可以组合多个类型的特性,创建出更灵活、复合的类型。例如,类型 A & B 表示一个包含类型 A 和类型 B 特性的新类型。

青轩桃李能几何,流光欺人忽蹉跎 1573

TypeScript中的联合与交叉类型深入解析

本文深入探讨了TypeScript中的联合与交叉类型的应用,特别是在处理技术事件类型时的实践。我们学习了如何通过属性值的类型来固定联合类型中的具体类型,并理解了这一点对于编写安全且健壮的代码的重要性。此外,我们还探讨了类型推断的利与弊,以及如何利用TypeScript的const上下文来提升类型安全性。

weixin_31961675的博客 1000

深入理解TypeScript高级类型与模式

本文是对《TypeScript高级类型与模式》书籍中的一个章节内容的深入解析。文章探讨了TypeScript中复杂类型的使用,包括但不限于索引访问限制、联合类型、交叉类型、条件类型、泛型、类型断言等。通过详细的代码示例和实际应用案例,揭示了TypeScript在现代JavaScript开发中的强类型特性如何提升代码质量和可维护性。对于前端开发者和TypeScript学习者而言,本文将是一次对高级类型系统的深入洞察。

weixin_42497762的博客 422

深入理解 TypeScript:联合类型与交叉类型的应用

深入理解 TypeScript:联合类型与交叉类型的应用

一起coding,一起嗨。 644

英飞凌功率MOSFET SPICE 瞬态仿真不收敛问题解决(基于TINA)

英飞凌功率MOSFET SPICE仿真容易出现不收敛问题,这个对于IGBT和SIC的管子应该是一样的,在瞬态仿真分析中,出现如下图所示的报错,Convergence problem。spice是为线性电路设计的,例如运算放大器、线性电源等,不是专门仿真开关电路的。在瞬态仿真时,仿真器是要不断迭代求解的,开关快速的跳变,容易在迭代式出现不收敛的问题。,由于时间步长减少,会消耗更多的计算机内存,如果运行多次内存消耗过大,会报“Out of memory”.解决方法是:报错工程,重启软件,内存重新计算。

miaoxiaokeji的博客 2300

TypeScript 中的高级类型

TypeScript 的高级类型为开发者提供了强大的工具来处理复杂的类型关系和场景。掌握这些高级类型是深入理解和有效使用 TypeScript 的关键。随着 TypeScript 版本的不断更新,新的特性也在不断加入,因此持续学习和实践是必要的。

全栈若城,专注知识分享 6万+

点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码)

本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。

weixin_29061041的博客 155

智能车竞赛轮腿穿越组:GPS+IMU导航绕桩实战技巧(附避坑指南)

本文详细介绍了智能车竞赛轮腿穿越组中GPS+IMU导航绕桩的实战技巧,包括硬件选型、传感器标定、路径规划及多传感器数据融合策略。通过实际案例和避坑指南,帮助参赛队伍提升导航精度和稳定性,避免常见错误。特别强调IMU安装位置和标定对导航系统的重要性。

gin88的博客 585

TypeScript进阶:探索高级类型与泛型在大型项目中的威力

TypeScript的高级类型是在基本类型(如string、number、boolean等)基础上扩展的一系列强大特性,旨在提高代码的健壮性、可读性和可维护性。

qq_35374791的博客 997

【SimPy系列博客之官方example学习与解读】—— Example 1: Bank Renege

Hello,优快云的各位小伙伴们,拖更了几年后,又重新开始记录这段时间准备学习的东西啦!最近博主在学习 SimPy 的相关知识,发现国内关于 SimPy 的介绍还是相对较少,且缺乏系统性,因此博主打算用1~2周的时间,边学边记,打算从 SimPy 官方给出的几个例子出发分析 SimPy 的使用场景和用法,希望能和大家互勉!那废话不多说,我们直接开始吧!今天要学习的例程是 Bank Renege。

凝望,划过星空的博客 2009

深入理解 TypeScript 高级用法

单独使用条件类型可能用处不是很大,但是结合泛型使用时就非常有用。一个常见的用例就是使用带有 never 类型的条件类型来修剪类型中的值。其中 NullableString​ 可以是 string​ 或 null​ 类型,它用于 itemName​ 变量。never : T;NonNullable​ 和 NoNull​ 之间的区别在于 NonNullable​ 将从类型中删除 undefined​ 以及 null。// 这里取一个[0, 10)范围内的随机值。

Jack, what else can you do besides holding your little darling? 1468

Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

Polyworks脚本开发学习笔记(十五)-利用Python连接Polyworks的COM组件

qq_43662503的博客 2504

【安全启动】HSM安全启动原理与技术实现白皮书

摘要: 安全启动(Secure Boot)与度量启动(Measured Boot)通过硬件信任根(HSM/TPM等)确保系统启动链路的可信性,实现代码验证与状态记录。HSM作为核心组件,承担密钥保护、签名验证和密码运算任务,与SHE、TPM等协同构建分层信任链。通用计算与嵌入式/汽车场景的启动流程差异显著,前者依赖TPM的PCR度量,后者以HSM为核心实现硬件级安全闭环。工程实践中需权衡性能、合规性及抗攻击能力,并结合后量子密码(PQC)等演进技术优化方案。

weixin_46481662的博客 836

TypeScript 中高频出现的类型结构与用法

本文整理 TypeScript 在实际项目中高频使用的 15 个核心类型模式,涵盖类型推断、联合与交叉类型、泛型约束、映射类型、条件类型、infer、as const 等关键能力。重点说明每项技巧的语义,帮助开发者系统掌握类型系统的核心机制,提升代码的可维护性与静态检查能力。

weixin_45511682的博客 756

innovus:NRDB-2276 special net route layer与NanoRouteMode route layer冲突问题解决方法

NanoRouteMode中设置绕线层次2-6,但是被动到的special net有8-11的preferred route layer,这个层次可能是create_route_type+set_ccopt_property -net_type 定义的。二者绕线层次范围有冲突,导致在调整过这条net后再绕线就会提示失败。然后再下route_design 等route命令去绕别的net。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1105

TypeScript高级类型实战:联合、交叉与条件类型解析

类型系统是现代编程语言的核心机制,通过静态类型检查提升代码质量与开发效率。TypeScript作为JavaScript的超集,其高级类型系统通过联合类型(Union Type)和交叉类型(Intersection Type)实现了灵活的类型组合,配合条件类型(Conditional Type)可创建动态类型逻辑。这些特性在工程实践中能有效解决API响应处理、状态管理、表单验证等场景的类型安全问题,特别适合大型前端项目开发。通过类型守卫和类型推断技术,开发者可以在编译时捕获潜在错误,而映射类型和模板字面量类型

weixin_31315567的博客 231

实战!用Python爬取海关总署进出口贸易数据 —— 从反爬突破到数据可视化全流程指南

{"period": "2026-05", "country": "美国", "import_val": 123.4, "export_val": 567.8, ...}研究员可构建领先指标模型;fig = px.bar(top, x="country", y="total_usd", title="贸易总额TOP10")html.H1("海关进出口数据看板", style={"textAlign": "center"}),"""发起带签名的POST请求(实际为GET + query param)"""

2201_76125261的博客 591

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TypeScript基础语法与类型系统详解

TypeScript 是 JavaScript 的超集,提供了静态类型检查和丰富的类型系统,帮助开发者写出更健壮和可维护的代码。本文将系统介绍 TypeScript 的基础语法与类型系统,包括基本类型、类型组合、接口与类型别名、高级类型用法等核心内容。

2403_86719076的博客 924

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

The Concise TypeScript Book:深入理解交叉类型(Intersection Types)的 `&` 操作符

交叉类型(Intersection Type)是 TypeScript 中通过 `&` 符号组合多个类型、要求值同时满足所有成员约束的核心类型构造手段。本篇指南基于开源项目 [The Concise TypeScript Book](https://link.gitcode.com/i/34ebcf3fd99a7071373398b659242cf5) 章节展开,并结合仓库内 [Union Typ

gitblog_00656的博客 157

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TypeScript进阶 类型演算与高级内置类型

本文深入探讨了 TypeScript 类型演算的原理和应用。通过使用类型演算,我们可以在编译时对类型进行操作和计算,从而提供更强大的类型系统。通过合理地运用类型推断、条件类型、映射类型等工具,我们可以编写更安全、更健壮的代码,并提高开发效率。希望本文能够帮助读者深入理解 TypeScript 类型演算,并在实际开发中得到应用。

1795

typeScript --基础数据类型

目录 基础类型 javascript基础类型 typescript扩展类型 高级类型 交叉类型 联合类型 类型保护与区分类型 可辨识联合 基础类型 javascript基础类型 基础类型 类型名称 示例 布尔 boolean let gender:boolean=false 数字 number let a...

前端小愤青 653

1. TypeScript 的基本类型

1. TypeScript 的基本类型string, number, boolean数组接口 Interface内联类型特殊类型 按照深入理解typescript 以及typescript再学习 整理 string number boolean 数组 boolean[] 接口 interface 内联类型 特殊类型 string, number, boolean let str: string; let num: number; let bool: boolean; str = '123'; num

weixin_45459789的博客 222

Total TypeScript Book权威指南:解锁TypeScript高级特性的10个秘诀

Total TypeScript Book是一本全面的TypeScript学习指南,旨在帮助开发者从基础到高级掌握TypeScript的核心概念和实用技巧。本指南将带你探索10个关键秘诀,让你在TypeScript的世界中更加游刃有余,提升代码质量和开发效率。 ## 秘诀一:理解TypeScript的工作原理 🚀 TypeScript作为JavaScript的超集,其工作流程与JavaScr

gitblog_00151的博客 939
上一篇: Typescript高级: 深入理解Extract类型
下一篇: Go微服务: Http服务注册在Consul的示例(非Go-Micro)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值