系统学习 TypeScript(五)——联合类型

简介: 在初步学习了 TypeScript 的变量声明后,对它的静态类型检查功能简直是爱不释手,但同时也发现一个问题:在正常的开发中,一个变量的类型有时可能不仅仅只限于 number 或者 string 中的一种,有可能是两种类型或者更多,

7.png


前言


在初步学习了 TypeScript 的变量声明后,对它的静态类型检查功能简直是爱不释手,但同时也发现一个问题:在正常的开发中,一个变量的类型有时可能不仅仅只限于 number 或者 string 中的一种,有可能是两种类型或者更多,比如:


// index.js
let res;
if(userInfo.age && userInfo.age > 12){
    res = userInfo.age;
}else{
    res = userInfo.name;
}


上面例子中的 res 类型可能是 number,也可能是 string。


到底该怎样限制 res 的类型,让它同时满足 number 和 string 的类型检查呢?这就涉及到我们今天要学的 TypeScript 的另一种类型声明——联合类型。


关于联合类型


从字面意思来看,所谓“联合类型”其实就是多种类型的联合,也就是不仅仅一种类型。


联合类型(Union Types)可以通过管道(|)给变量设置多种类型,赋值时可以根据设置的类型来赋值。


基本语法如下:


let tag:Type1|Type2|Type3


其中使用“|”分隔的三种类型代表变量 tag 可被赋值的类型范围。


注意:对于指定了联合类型的变量,其值的类型必须只能是联合类型中包含的某一种,如果取了联合类型之外的类型值,在编译过程中会报错。

指定了联合类型的变量可以在运行过程中被赋予联合类型中的任一类型值。


实际使用示例


以下是联合类型的几种实际应用举例。


声明变量


let res: number | string;  // 联合类型声明
if (userInfo.age > 12) {
    res = userInfo.age;
} else {
    res = userInfo.name;
}
return res;


上例中的 res 只能赋值为 number 类型或 string 类型,赋值其它类型会产生报错。


函数传参


我们在函数传参中也可以使用联合类型来控制参数的预期类型:


function sayRes(res: number | string){
    console.log(res);
}
sayRes(true); // Error: 类型“boolean”的参数不能赋给类型“string | number”的参数。


联合类型数组


对于可能由不同单一类型元素组成的数组声明,我们也可以使用联合类型进行声明。


let arr5: number[] | string[];
arr5[0] = true; // Error: 不能将类型“boolean”分配给类型“string | number”。


扩展知识


针对联合类型的数据,主要扩展以下几点。


只能访问共有属性或方法


一般情况下,使用联合类型是因为不能确定变量最终值的类型。


对于联合类型的变量或参数,如果不能确定其具体类型的时候,只能访问联合类型中所有类型共有的属性或方法,若访问某一类型独有的属性或方法,会产生报错。


function sayRes(res: number | string) {
    if (res.length > 0) { // Error: 类型“number”上不存在属性“length”。
    }
}


当 res 为 number 类型时,是不存在 .length 属性的,所以会报错。


下面这个例子中,因为 .toString() 是 number 和 string 类型共有的方法,所以可正常编译:


function sayRes(res: number | string) {
    if (res.toString() === "12") {
    }
}


类型推断


对于联合类型变量,在赋值后会根据值的类型推断该变量的类型。


let res :number | string;
res = "编程三昧";
console.log(res.length);
res = 12;
console.log(res.length);  // Error: 类型“number”上不存在属性“length”。


在给 res 赋值为 12 后,TypeScript 推断 res 的类型为 number,number 类型不存在 .length 属性,所以报错。


总结


以上就是 TypeScript 联合类型的相关知识,总结起来就是:


  • 联合类型包含了变量可能的所有类型;
  • 对联合类型变量赋值为联合类型之外的值,会产生报错;
  • 在不能确定联合类型变量的最终类型之前,只能访问联合类型所共有的属性和方法。


~ 本文完,感谢阅读!


学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!




相关文章
|
13天前
|
JavaScript 安全 前端开发
TypeScript类型声明:基础与进阶
通过本文的介绍,我们详细探讨了TypeScript的基础与进阶类型声明。从基本数据类型到复杂的泛型和高级类型,TypeScript提供了丰富的工具来确保代码的类型安全和可维护性。掌握这些类型声明能够帮助开发者编写更加健壮和高效的代码,提高开发效率和代码质量。希望本文能为您在使用TypeScript时提供实用的参考和指导。
25 2
|
26天前
|
JavaScript 开发者
在 Babel 插件中使用 TypeScript 类型
【10月更文挑战第23天】可以在 Babel 插件中更有效地使用 TypeScript 类型,提高插件的开发效率和质量,减少潜在的类型错误。同时,也有助于提升代码的可理解性和可维护性,使插件的功能更易于扩展和升级。
|
1月前
|
JavaScript 前端开发
TypeScript【类型别名、泛型】超简洁教程!再也不用看臭又长的TypeScript文档了!
【10月更文挑战第11天】TypeScript【类型别名、泛型】超简洁教程!再也不用看臭又长的TypeScript文档了!
|
1月前
|
JavaScript 前端开发 安全
TypeScript【基础类型】超简洁教程!再也不用看臭又长的TypeScript文档了!
【10月更文挑战第9天】TypeScript【基础类型】超简洁教程!再也不用看臭又长的TypeScript文档了!
|
1月前
|
移动开发 JavaScript 前端开发
TypeScript:数组类型&函数使用&内置对象
本文介绍了 TypeScript 中的数组类型、对象数组、二维数组、函数、函数重载、内置对象等概念,并通过代码示例详细展示了它们的使用方法。还提供了一个使用 HTML5 Canvas 实现的下雨效果的小案例。
|
25天前
|
JavaScript 前端开发 安全
TypeScript进阶:类型系统与高级类型的应用
【10月更文挑战第25天】TypeScript作为JavaScript的超集,其类型系统是其核心特性之一。本文通过代码示例介绍了TypeScript的基本数据类型、联合类型、交叉类型、泛型和条件类型等高级类型的应用。这些特性不仅提高了代码的可读性和可维护性,还帮助开发者构建更健壮的应用程序。
25 0
|
1月前
|
JavaScript 索引
TypeScript(TS)安装指南与基础教程学习全攻略(二)
TypeScript(TS)安装指南与基础教程学习全攻略(二)
54 0
|
1月前
|
JavaScript 前端开发 安全
TypeScript(TS)安装指南与基础教程学习全攻略(一)
TypeScript(TS)安装指南与基础教程学习全攻略(一)
29 0
|
2月前
|
JavaScript
typeScript进阶(9)_type类型别名
本文介绍了TypeScript中类型别名的概念和用法。类型别名使用`type`关键字定义,可以为现有类型起一个新的名字,使代码更加清晰易懂。文章通过具体示例展示了如何定义类型别名以及如何在函数中使用类型别名。
41 1
typeScript进阶(9)_type类型别名
|
1月前
|
JavaScript 前端开发 安全
深入理解TypeScript:增强JavaScript的类型安全性
【10月更文挑战第8天】深入理解TypeScript:增强JavaScript的类型安全性
48 0
下一篇
无影云桌面