19.【TypeScript 教程】联合类型

简介: 19.【TypeScript 教程】联合类型

TypeScript 联合类型

本节介绍联合类型,它使用管道符 | 把多个类型连起来,表示它可能是这些类型中的其中一个。我们把 | 理解成 or,这样便于轻松记忆


1. 解释

联合类型与交叉类型很有关联,但是使用上却完全不同。区别在于:联合类型表示取值为多种中的一种类型,而交叉类型每次都是多个类型的合并类型。

语法为:类型一 | 类型二


2. 简单示例

联合类型之间使用竖线 “|” 分隔:

let currentMonth: string | number
 
currentMonth = 'February'
currentMonth = 2

代码解释: 第 1 行,表示 currentMonth 的值可以是 string 类型或者 number 类型中的一种。

联合类型的构成元素除了类型,还可以是字面量

type Scanned = true | false
type Result = { status: 200, data: object } | { status: 500, request: string}

代码解释:


第 1 行,表示类型别名 Scanned 可以是 true 或者 false 两种布尔字面量中的一种。


第 2 行,表示类型别名 Result 可以是 { status: 200, data: object } 或者 { status: 500, request: string} 两个对象字面量中的一种。



3. 访问联合类型成员

如果一个值是联合类型,那么只能访问联合类型的共有属性或方法

interface Dog {
  name: string,
  eat: () => void,
  destroy: () => void
}
 
interface Cat {
  name: string,
  eat: () => void,
  climb: () => void
}
 
let pet: Dog | Cat
pet!.name    // OK
pet!.eat()   // OK
pet!.climb() // Error

代码解释:

第 13 行,声明变量 petDog | Cat 联合类型,那么变量 pet 可以访问接口 Dog 和 接口 Cat 共有的 name 属性和 eat() 方法。访问接口 Cat 独有的 climb() 方法是错误的。

4. 可辨识联合

联合类型的应用场景很多,我们在类型保护那一节介绍了大量的联合类型的例子。

下面再介绍一个求不同图形面积的综合性实例:

实例演示

interface Rectangle {
  type: 'rectangle',
  width: number,
  height: number
}
 
interface Circle {
  type: 'circle',
  radius: number
}
 
interface Parallelogram {
  type: 'parallelogram',
  bottom: number,
  height: number
}
 
function area(shape: Rectangle | Circle | Parallelogram) {
  switch (shape.type) {
    case 'rectangle':
      return shape.width * shape.height
    case 'circle':
      return Math.PI * Math.pow(shape.radius, 2)
    case 'parallelogram':
      return shape.bottom * shape.height
  }
}
 
let shape: Circle = {
  type: 'circle',
  radius: 10
}
 
console.log(area(shape))

代码解释:


第 18 行,函数 area() 的参数是一个 Rectangle | Circle | Parallelogram 联合类型。


其中,每个接口都有一个 type 属性,根据其不同的字符串字面量类型引导到不同的 case 分支,这种情况我们称之为『可辨识联合(Discriminated Union)』。



5. 小结

本节介绍了高级类型中的联合类型,下节开始介绍类型别名。需要记住的是:

  • | 理解成 or,便于记忆。
  • 如果一个值是联合类型,那么只能访问联合类型的共有属性或方法
相关文章
|
27天前
|
设计模式 JavaScript 安全
TypeScript性能优化及代码质量提升的重要性、方法与策略,包括合理使用类型注解、减少类型断言、优化模块导入导出、遵循编码规范、加强代码注释等
本文深入探讨了TypeScript性能优化及代码质量提升的重要性、方法与策略,包括合理使用类型注解、减少类型断言、优化模块导入导出、遵循编码规范、加强代码注释等,旨在帮助开发者在保证代码质量的同时,实现高效的性能优化,提升用户体验和项目稳定性。
42 6
|
26天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
35 2
|
1月前
|
JavaScript 安全 前端开发
TypeScript类型声明:基础与进阶
通过本文的介绍,我们详细探讨了TypeScript的基础与进阶类型声明。从基本数据类型到复杂的泛型和高级类型,TypeScript提供了丰富的工具来确保代码的类型安全和可维护性。掌握这些类型声明能够帮助开发者编写更加健壮和高效的代码,提高开发效率和代码质量。希望本文能为您在使用TypeScript时提供实用的参考和指导。
36 2
|
1月前
|
JavaScript 开发者
在 Babel 插件中使用 TypeScript 类型
【10月更文挑战第23天】可以在 Babel 插件中更有效地使用 TypeScript 类型,提高插件的开发效率和质量,减少潜在的类型错误。同时,也有助于提升代码的可理解性和可维护性,使插件的功能更易于扩展和升级。
|
2月前
|
JavaScript 前端开发
TypeScript【类型别名、泛型】超简洁教程!再也不用看臭又长的TypeScript文档了!
【10月更文挑战第11天】TypeScript【类型别名、泛型】超简洁教程!再也不用看臭又长的TypeScript文档了!
|
2月前
|
JavaScript 前端开发 Java
TypeScript【接口】超简洁教程!再也不用看臭又长的TypeScript文档了!
【10月更文挑战第10天】TypeScript【接口】超简洁教程!再也不用看臭又长的TypeScript文档了!
|
2月前
|
JavaScript 前端开发 安全
TypeScript【基础类型】超简洁教程!再也不用看臭又长的TypeScript文档了!
【10月更文挑战第9天】TypeScript【基础类型】超简洁教程!再也不用看臭又长的TypeScript文档了!
|
2月前
|
JavaScript 前端开发 开发者
深入理解TypeScript:类型系统与最佳实践
【10月更文挑战第8天】深入理解TypeScript:类型系统与最佳实践
|
2月前
|
移动开发 JavaScript 前端开发
TypeScript:数组类型&函数使用&内置对象
本文介绍了 TypeScript 中的数组类型、对象数组、二维数组、函数、函数重载、内置对象等概念,并通过代码示例详细展示了它们的使用方法。还提供了一个使用 HTML5 Canvas 实现的下雨效果的小案例。
|
1月前
|
JavaScript 前端开发 安全
TypeScript进阶:类型系统与高级类型的应用
【10月更文挑战第25天】TypeScript作为JavaScript的超集,其类型系统是其核心特性之一。本文通过代码示例介绍了TypeScript的基本数据类型、联合类型、交叉类型、泛型和条件类型等高级类型的应用。这些特性不仅提高了代码的可读性和可维护性,还帮助开发者构建更健壮的应用程序。
31 0
下一篇
DataWorks