当前位置: 首页 > article >正文

【TS】TypeScript 类型定义之联合类型(union types)和交叉类型(intersection types)

你提供的代码是 TypeScript 中的一种类型定义,它使用了联合类型(union types)和交叉类型(intersection types)。让我们逐步解析这个定义:

基础类型

首先,假设你已经定义了一个基础类型 baseSection,例如:

type baseSection = {
  id: string;
  title: string;
};

联合类型和交叉类型

接下来是类型定义 SectionItem

type SectionItem = baseSection &
  (
    | {
        type: "doc";
        icon: string;
      }
    | {
        type: "card";
        desc: string;
        img: string;
      }
  );

这个定义可以拆解为以下部分:

  1. 交叉类型(Intersection Type)
    baseSection & (...) 表示 SectionItem 类型必须同时拥有 baseSection 类型的属性和括号内的联合类型之一的属性。

  2. 联合类型(Union Type)
    括号内的部分定义了一个联合类型:

    {
      type: "doc";
      icon: string;
    }
    |
    {
      type: "card";
      desc: string;
      img: string;
    }
    

    这意味着 SectionItem 可以是以下两种类型之一:

    • 一个对象,包含 type"doc"icon 属性。
    • 一个对象,包含 type"card"descimg 属性。

组合在一起

将交叉类型和联合类型组合在一起,SectionItem 类型必须包含 baseSection 的属性,同时根据 type 的不同,还必须包含特定的附加属性。

具体来说:

  • 如果 type"doc",那么 SectionItem 必须包含 baseSection 的属性以及 icon 属性。
  • 如果 type"card",那么 SectionItem 必须包含 baseSection 的属性以及 descimg 属性。

示例

以下是两个有效的 SectionItem 类型的对象示例:

const docItem: SectionItem = {
  id: "1",
  title: "Documentation",
  type: "doc",
  icon: "doc-icon.png"
};

const cardItem: SectionItem = {
  id: "2",
  title: "Card",
  type: "card",
  desc: "This is a card description.",
  img: "card-image.png"
};

总结

这种写法在 TypeScript 中非常有用,它允许你定义复杂的对象类型,确保对象必须包含某些基础属性,同时根据某个属性的值(如 type)来包含不同的附加属性。这种类型定义方式可以提高代码的类型安全性和可读性。


http://www.kler.cn/a/372161.html

相关文章:

  • 前端好用的网站分享——CSS(持续更新中)
  • Ubuntu编译linux内核指南(适用阿里云、腾讯云等远程服务器;包括添加Android支持)
  • CSP/信奥赛C++刷题训练:经典前缀和例题(4):洛谷P3662:Why Did the Cow Cross the Road II S
  • 根据输入的详细地址解析经纬度
  • 驱动和芯片设计哪个难
  • Soanrquber集成Gitlab 之 导入Gitlab项目
  • Git_码云
  • RabbitMQ如何防止消息丢失及重复消费
  • C++中封装红黑树模拟实现map和set
  • echarts横向左右对比柱状图,两种展示方式(对向、反向)
  • 【大数据学习 | kafka】kafuka的基础架构
  • 使用Git进行版本控制的最佳实践
  • 1G-5G的技术转变和应用
  • 如何结合社交媒体进行ASO推广?
  • 技术干货|如何巧妙利用数字孪生技术助力口腔保健分析
  • 瑞芯微RK3566/RK3568 Android11下该如何默认屏蔽导航栏/状态栏?看这篇文章就懂了
  • 2023年信息安全工程师摸底测试卷
  • MongoDB 6.0 主从复制配置
  • 深度学习:正则化(Regularization)详细解释
  • 南山区怡海地铁站附近的免费停车点探寻
  • 蓝桥杯 python day01 第一题
  • Git获取本地仓库和常用指令
  • MongoDB 8.0 全新登场:究竟如何?
  • Python入门——iter迭代器—__iter__()方法__next__()方法
  • Comsol CPU水冷散热系统流热固多场耦合仿真
  • 【重生之我要苦学C语言】操作符详解、结构体与表达式求值过程