告别类型判断烦恼:TypeScript 联合类型与类型守卫实战

简介: 告别类型判断烦恼:TypeScript 联合类型与类型守卫实战

告别类型判断烦恼:TypeScript 联合类型与类型守卫实战

在日常开发中,我们常常需要处理可能是多种类型的变量。例如,一个参数可以是 stringnumber,一个 API 响应可能成功或失败。在纯 JavaScript 中,处理这种不确定性需要大量的 typeof 和属性检查,既繁琐又容易出错。

TypeScript 的联合类型(Union Types)类型守卫(Type Guards) 正是为此而生的强大组合,它们能让我们在享受灵活性的同时,保证代码的类型安全。

一、 联合类型:表达不确定性

联合类型使用 | 运算符,表示一个值可以是几种类型之一。

function printId(id: number | string) {
   
  console.log(`Your ID is: ${
     id}`);
}

printId(101); // OK
printId("ABC202"); // OK
printId({
    key: "value" }); // Error!

现在,id 可以是数字或字符串,但直接对其操作(比如调用 toUpperCase())会报错,因为 TypeScript 不知道在运行时它具体是哪种类型。

二、 类型守卫:缩小类型范围

类型守卫是能够在运行时检查类型的表达式,它帮助 TypeScript 在特定代码块中收窄(Narrow) 变量的类型。

1. typeof 守卫:
处理基本类型时最常用。

function printId(id: number | string) {
   
  if (typeof id === "string") {
   
    // 在此块内,TypeScript 知道 id 是 string
    console.log(id.toUpperCase());
  } else {
   
    // 在此块内,id 是 number
    console.log(id.toFixed(2));
  }
}

2. in 守卫:
检查对象是否拥有特定属性,适用于区分对象联合类型。

interface Circle {
   
  kind: "circle";
  radius: number;
}

interface Square {
   
  kind: "square";
  sideLength: number;
}

type Shape = Circle | Square;

function getArea(shape: Shape) {
   
  if ("radius" in shape) {
   
    // 收窄为 Circle
    return Math.PI * shape.radius ** 2;
  } else {
   
    // 收窄为 Square
    return shape.sideLength ** 2;
  }
}

3. 自定义类型守卫函数:
对于更复杂的逻辑,可以定义一个返回类型为 arg is Type 的函数。

function isCircle(shape: Shape): shape is Circle {
   
  return shape.kind === "circle";
}

function getArea(shape: Shape) {
   
  if (isCircle(shape)) {
   
    // 因为 isCircle 是类型守卫,这里 shape 被收窄为 Circle
    return Math.PI * shape.radius ** 2;
  }
  // ... 处理 Square
}

总结

联合类型与类型守卫是 TypeScript 类型系统的核心利器。它们允许我们清晰地表达业务逻辑中的不确定性,并通过编译时的强制检查,将许多潜在的运行时错误消灭在编码阶段。善用它们,能极大提升代码的健壮性和开发体验。

目录
相关文章
|
并行计算 PyTorch 算法框架/工具
社区供稿 | 本地部署通义千问大模型做RAG验证
这篇文章中,我们通过将模搭社区开源的大模型部署到本地,并实现简单的对话和RAG。
|
存储 JavaScript 前端开发
|
10月前
|
存储 消息中间件 Kafka
Confluent 首席架构师万字剖析 Apache Fluss(三):湖流一体
原文:https://jack-vanlightly.com/blog/2025/9/2/understanding-apache-fluss 作者:Jack Vanlightly 翻译:Wayne Wang@腾讯 译注:Jack Vanlightly 是一位专注于数据系统底层架构的知名技术博主,他的文章以篇幅长、细节丰富而闻名。目前 Jack 就职于 Confluent,担任首席技术架构师,因此这篇 Fluss 深度分析文章,具备一定的客观参考意义。译文拆成了三篇文章,本文是第二篇。
967 25
Confluent 首席架构师万字剖析 Apache Fluss(三):湖流一体
|
9月前
|
人工智能 缓存 监控
别再瞎试!一套"万能prompt框架"让AI输出质量提升10倍
作为一名后端开发,我曾因AI答非所问而崩溃。三个月摸索后,总结出高效提问的RBTRO框架:角色、背景、任务、要求、输出。套用需求文档思维,让AI从“瞎猜”变“精准执行”,效率提升10倍。附5大实战场景与可复用模板,助你快速上手。
|
缓存 JavaScript 前端开发
《凭什么撼动Node.js?Bun和Zig性能优势深度揭秘》
Node.js长期主导服务器端运行时,但新兴的Bun和Zig正带来新挑战。Bun是一款高性能JavaScript运行时,基于Zig语言开发,启动速度快4倍于Node.js,依赖管理效率提升25倍。它集成了打包、转译、测试等功能,简化开发流程。Zig则以精细的内存管理和跨平台能力助力Bun性能飞跃,同时在服务端渲染、命令行工具开发等场景中表现出色。尽管Node.js生态成熟,Bun和Zig正逐步改写JavaScript运行时格局,推动技术进步。
882 15
|
5月前
|
SQL 人工智能 Java
告别传统 Text-to-SQL:基于 Spring AI Alibaba 的数据分析智能体 DataAgent 深度解析
超越 NL2SQL,DataAgent 具备自主规划与深度分析能力,赋能企业统计分析、根因定位等复杂场景挑战。
2467 54
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
1470 0
|
4月前
|
资源调度 JavaScript 前端开发
前端组件库——Arco Design Vue知识点大全(一)
教程来源 https://bncne.cn/sheyingjiqiao.html Arco Design Vue是字节跳动开源的企业级Vue 3设计系统,源于抖音等亿级应用实践。聚焦设计一致性、开发提效与多端适配,具备60+高质量组件、全TypeScript支持、极致性能及可视化主题定制能力,已成为Vue 3生态中增长迅速的现代化UI解决方案。
|
4月前
|
JavaScript 前端开发 数据可视化
前端组件库——Arco Design Vue知识点大全(三)
教程来源 https://bncne.cn/qicaipingce.html Arco Design Vue是字节跳动开源的Vue 3企业级UI库,支持按需引入、虚拟滚动、图标优化等性能方案;提供Design Lab主题定制、Icon Box图标管理、Arco Pro中后台模板等完整生态,助力高效构建高质量中后台应用。
|
10月前
|
Web App开发 监控 JavaScript
如何最小化重排和重绘?
如何最小化重排和重绘?
620 136

热门文章

最新文章