系统学习 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 联合类型的相关知识,总结起来就是:


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


~ 本文完,感谢阅读!


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




相关文章
|
2月前
|
JavaScript 前端开发
揭秘 TypeScript 条件类型:超越简单类型检查
揭秘 TypeScript 条件类型:超越简单类型检查
|
2月前
|
JavaScript 安全 索引
TypeScript 高级类型工具:Partial, Required, Record 的妙用与陷阱
TypeScript 高级类型工具:Partial, Required, Record 的妙用与陷阱
|
2月前
|
JavaScript 安全 IDE
TypeScript 类型体操:别让 `any` 毁了你的安全网!
TypeScript 类型体操:别让 `any` 毁了你的安全网!
|
2月前
|
JavaScript 安全 编译器
TypeScript 类型守卫:让你的类型系统更智能
TypeScript 类型守卫:让你的类型系统更智能
|
3月前
|
自然语言处理 JavaScript 前端开发
一夜获千星!已获 1.7k+,Art Design Pro:Vue3 + Vite + TypeScript 打造的高颜值管理系统模板,这个让后端小哥直呼救命的后台系统
Art Design Pro 是一款基于 Vue 3、Vite 和 TypeScript 的高颜值后台管理系统模板,已获 1.7k+ 星标。项目专注于用户体验与视觉设计,支持主题切换、多语言、权限管理及图表展示等功能,内置常用业务组件,便于快速搭建现代化管理界面。其技术栈先进,开发体验流畅,适配多设备,满足企业级应用需求。项目地址:[GitHub](https://github.com/Daymychen/art-design-pro)。
502 11
|
7月前
|
存储 安全 JavaScript
TypeScript-内置应用程序类型-Recode
通过使用 `Record` 类型,开发者可以显著提升代码的安全性和可维护性。无论是配置对象、字典结构还是动态表单,`Record` 类型都提供了一个简洁、类型安全的解决方案。
318 82
|
8月前
|
存储 人工智能 开发框架
Eliza:TypeScript 版开源 AI Agent 开发框架,快速搭建智能、个性的 Agents 系统
Eliza 是一个开源的多代理模拟框架,支持多平台连接、多模型集成,能够快速构建智能、高效的AI系统。
730 8
Eliza:TypeScript 版开源 AI Agent 开发框架,快速搭建智能、个性的 Agents 系统
|
10月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
207 2
|
11月前
|
JavaScript 前端开发 安全
深入理解TypeScript:增强JavaScript的类型安全性
【10月更文挑战第8天】深入理解TypeScript:增强JavaScript的类型安全性
225 0
|
11月前
|
JavaScript 前端开发 开发者
深入理解TypeScript:类型系统与实用技巧
【10月更文挑战第8天】深入理解TypeScript:类型系统与实用技巧

热门文章

最新文章