当前位置: 首页 > news >正文

【通俗易懂】TypeScript 的类型守卫 (Type Guards)作用理解

把“类型守卫”想成安检口的小哥哥/小姐姐:

  1. 场景
    你手里拿了个东西,只知道它是“不明包裹”(联合类型)。
    比如:

    function process(input: string | number) {// 这里 input 是“既可能是 string,也可能是 number”
    }
    
  2. 没有类型守卫 —— 蒙着眼干活
    直接写 input.length 会报错:
    “万一它是数字呢?数字可没有 length!”

  3. 类型守卫 —— 安检口查一查
    安检员看一眼包裹,告诉你:“放心,这是字符串!”
    于是后面的代码就可以大胆地用字符串的方法了。

    function isString(x: any): x is string {return typeof x === 'string';
    }function process(input: string | number) {if (isString(input)) {// 安检通过,TypeScript 立刻知道 input 现在是 stringconsole.log(input.length); // ✅ 不报错} else {// 走到这里,TypeScript 就知道它是 numberconsole.log(input.toFixed(2)); // ✅ 也不报错}
    }
    
  4. 常见安检手段(类型守卫)

    • typeof x === 'string' / typeof x === 'number'
    • x instanceof Date
    • 自定义函数返回 x is SomeType(上面例子里的 isString

一句话总结:
类型守卫 = 安检口
它帮你“看一眼”变量到底是哪种具体类型,通过后 TypeScript 就不再怀疑,让你安心用对应的方法和属性。

这里可能有朋友会有个疑问,这样的话和我们直接写个if else来判断类型又有什么区别呢?
其实区别只有一句话:
“你自己心里知道,但编译器不知道;类型守卫让编译器也知道。”

举个生活场景:

  1. 没有类型守卫(只有 if/else)

    function fn(x: string | number) {if (typeof x === 'string') {// 你清楚 x 是 string,但编译器仍把 x 当成 string | numberconsole.log(x.length);   // ❌ 报错:length 可能不存在}
    }
    
  2. 加了类型守卫

    function isString(x: any): x is string {return typeof x === 'string';
    }function fn(x: string | number) {if (isString(x)) {console.log(x.length);   // ✅ 编译器也点头:x 就是 string}// 这里 x 自动变成 number
    }
    

所以:

  • 普通 if/else 只是运行时的分支判断,TypeScript 的类型系统不会跟着变
  • 类型守卫额外给编译器发了一份“证明”,让它在编译阶段就把类型收窄,你才能安全地调用该类型专属的方法和属性,而不用到处 as string/as number 强转。
http://www.dtcms.com/a/347169.html

相关文章:

  • iperf2 vs iperf3:UDP 发包逻辑差异与常见问题
  • [新启航]白光干涉仪与激光干涉仪的区别及应用解析
  • ubuntu 新登录修改root密码
  • 【攻防世界】Web_php_include
  • 力扣热题之动态规划
  • CryptSIPVerifyIndirectData函数分析
  • 鸿蒙开发进阶(HarmonyOS)
  • STM32 外设驱动模块八:红外反射式光电模块
  • 【大语言模型 15】因果掩码与注意力掩码实现:深度学习中的信息流控制艺术
  • 2-5.Python 编码基础 - 键盘输入
  • 2025钉钉十周年新品发布会,新品 “蕨”命名,到底是什么?
  • vue3 - 组件间的传值
  • nodejs和vue安装步骤记录
  • 【Golang】有关任务窃取调度器和抢占式调度器的笔记
  • 机器人 - 无人机基础(5) - 飞控中的传感器(ing)
  • 【大语言模型 16】Transformer三种架构深度对比:选择最适合你的模型架构
  • 云原生俱乐部-k8s知识点归纳(8)
  • 资深产品经理个人能力提升方向:如何系统化进阶并考取高价值证书?
  • 资深产品经理个人能力提升方向:如何系统化进阶与考证规划
  • 可视化-模块1-HTML-02
  • Node.js特训专栏-实战进阶:23. CI/CD流程搭建
  • 国产轻量级桌面GIS软件Snaplayers从入门到精通(21)
  • 复杂街景误检率↓79%!陌讯动态融合算法在街道垃圾识别的边缘计算优化​​
  • Text2SQL、ChatBI简介
  • AI agent开发与大模型工程师面试复习纲要与高频面试题答案(4)-- AI agent系统设计与项目实践
  • Rust系统编程实战:驾驭内存安全、无畏并发与WASM跨平台开发
  • Go语言实战案例-Redis连接与字符串操作
  • python 字典有序性的实现和OrderedDict
  • 字节跳动开源Seed-OSS:36B参数模型以512K上下文与可控思考预算重新定义AI实用主义
  • Linux:进程间通信(IPC)-SystemV