news 2026/5/25 9:36:19

TypeScript 联合类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeScript 联合类型

TypeScript 中的联合类型(Union Types)详解

联合类型是 TypeScript 类型系统中最强大的特性之一,使用|(竖线)将多个类型组合起来,表示一个值可以是几种类型中的任意一种

1. 基本语法与用法
letid:string|number=123;// 可以是 string 或 numberid="abc123";// OK// id = true; // 错误:boolean 不属于联合类型

常见基础联合类型:

letflag:boolean|null=true;flag=null;// OKletstatus:"loading"|"success"|"error"="loading";status="success";// OK// status = "failed"; // 错误:不是这三个值之一
2. 类型缩小(Type Narrowing)—— 联合类型的核心优势

TypeScript 会根据条件判断自动缩小变量的类型范围,提供更精确的类型检查和智能提示。

functionprintId(id:string|number){// 这里 id 是 string | numberif(typeofid==="string"){// TS 自动缩小:这里 id 是 stringconsole.log(id.toUpperCase());// 安全调用字符串方法console.log(id.length);}else{// TS 自动缩小:这里 id 是 numberconsole.log(id.toFixed(2));// 安全调用数字方法}}printId(123);// 调用数字分支printId("hello");// 调用字符串分支

其他常见类型守卫(Type Guards)方式:

functionprocess(value:string|null|number){if(value===null){// value 被缩小为 nullreturn;}if(typeofvalue==="string"){// value 被缩小为 stringvalue.toLowerCase();}else{// value 被缩小为 numbervalue.toPrecision(2);}}
  • typeof检查原始类型(string/number/boolean/symbol/function)
  • ===/!==检查字面量或 null/undefined
  • 自定义类型守卫函数:
functionisString(value:any):valueisstring{returntypeofvalue==="string";}functionlog(value:string|number){if(isString(value)){// value 被缩小为 stringconsole.log(value.repeat(2));}}
3. 与其他类型的组合
a. 联合类型 + 数组
letmixedArray:(string|number)[]=[1,"two",3,"four"];mixedArray.push(5);// OKmixedArray.push("six");// OK// mixedArray.push(true); // 错误
b. 联合类型 + 对象属性
interfaceSuccess{type:"success";data:string;}interfaceError{type:"error";message:string;}typeResult=Success|Error;// 可辨识联合(Discriminated Union)functionhandleResult(result:Result){if(result.type==="success"){// result 被缩小为 Successconsole.log(result.data.toUpperCase());}else{// result 被缩小为 Errorconsole.log("错误:"+result.message);}}

可辨识联合是联合类型的最佳实践模式:通过一个共同的字面量属性(tag,如typekind)来区分不同分支。

4. 联合类型与函数
// 参数为联合类型functionformat(value:string|number):string{returntypeofvalue==="number"?value.toFixed(2):value.trim();}// 返回值为联合类型functiongetStatus():"ok"|"failed"|null{returnMath.random()>0.5?"ok":"failed";}
5. 常见内置联合类型
  • string | null | undefined:常用于可选值(开启strictNullChecks时)
  • HTMLElement | null:如document.getElementById()
  • any可以看作是所有类型的联合(但不推荐使用)
6. 注意事项
  • 联合类型的方法限制:只能调用所有类型共有的方法。
letvalue:string|number="hello";// value.toUpperCase(); // 错误:number 上没有这个方法value.toString();// OK:string 和 number 都有 toString()
  • 使用类型守卫来安全访问特定类型的方法。
7. 最佳实践建议
场景推荐用法
可能为空的值`string
状态机`“idle”
API 响应可辨识联合(带typekind字段)
多类型参数联合类型 + 类型守卫函数
避免过度宽松尽量用具体字面量联合,而不是 `string
小结:联合类型速查
写法含义示例场景
`stringnumber`ID 可以是字符串或数字
`“left”“right”“center”`
`SuccessError`可辨识联合
`Tnullundefined`

联合类型是 TypeScript 类型安全的核心,配合类型缩小可辨识联合,能大幅减少运行时错误,提升代码可维护性。

如果您想深入了解交叉类型(Intersection Types)联合类型与泛型的结合、或条件类型(Conditional Types),请告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 6:11:59

Open-AutoGLM高效开发实战(拖拽式流程设计全曝光)

第一章:Open-AutoGLM高效开发概览Open-AutoGLM 是一个面向生成式语言模型自动化开发的开源框架,旨在简化从模型训练、微调到部署的全流程。其核心设计理念是通过声明式配置与模块化组件结合,提升开发效率并降低使用门槛。核心特性 支持多后端…

作者头像 李华
网站建设 2026/5/26 5:46:03

Excalidraw项目空间组织结构设计

Excalidraw项目空间组织结构设计 在远程协作成为常态的今天,团队沟通中最缺失的是什么?不是视频会议里的面孔,也不是即时消息中的文字,而是那块可以随手涂画、边说边改的白板。真实会议室里,一张草图往往胜过千言万语&…

作者头像 李华
网站建设 2026/5/25 16:33:53

错过后悔一年:Open-AutoGLM即将闭源,现在是最后的免费使用窗口期!

第一章:Open-AutoGLM 技术支持效率提升Open-AutoGLM 是一款基于开源大语言模型(LLM)的自动化代码生成与技术支持平台,专为开发者和运维团队设计,旨在显著提升技术响应速度与问题解决效率。通过深度集成自然语言理解能力…

作者头像 李华
网站建设 2026/5/26 5:58:03

6、电脑文件操作与媒体播放全攻略

电脑文件操作与媒体播放全攻略 在日常使用电脑的过程中,我们经常需要对各种文件进行操作,同时也会涉及到媒体文件的播放等功能。下面将为大家详细介绍电脑文件操作以及媒体播放的相关知识和操作步骤。 1. 刻录音乐文件到 CD 如果你想将电脑中的音乐文件刻录到 CD 上,可按…

作者头像 李华
网站建设 2026/5/25 12:34:57

测试工具选型指南:为软件测试从业者打造的实用手册

在当今快速迭代的软件开发环境中,测试工具的选择直接影响项目的效率、质量和成本。对于软件测试从业者而言,一个合适的测试工具不仅能提升测试覆盖率,还能优化团队协作,降低维护负担。然而,市场上工具琳琅满目&#xf…

作者头像 李华
网站建设 2026/5/25 10:53:19

11、互联网浏览与电子邮件使用指南

互联网浏览与电子邮件使用指南 1. 网页导航 在浏览网页时,我们常常需要返回之前访问过的页面,或者前进到后续访问过的页面。Internet Explorer 提供了便捷的操作方法。 - 返回上一页 :只需点击“Back”按钮,即可显示上一个访问的页面。 - 返回多个页面 :点击“Rece…

作者头像 李华