Appearance
类型守卫:控制流分析如何把宽类型缩窄
主题边界
- 类型守卫的目标是在分支内部把联合类型缩窄为更具体的成员。
- 讨论它时要把编译器视角与运行时事实分开。
机制与流程
typeof、instanceof、in、字面量判别字段和用户自定义谓词函数都会参与控制流分析。- 当条件分支排除某些可能性后,编译器在该路径上收窄变量类型,这就是 narrowing。
- 判别联合最稳定的做法是设计一个不可歧义的 discriminant 字段,而不是依赖脆弱的存在性判断。
关键差异
- 守卫是在使用点缩窄,断言是直接告诉编译器“相信我”;两者安全级别不同。
- 运行时校验库如 zod/io-ts 与 TS 守卫常一起使用,前者给出真实验证,后者承接静态类型信息。
边界条件
- 错误的自定义类型谓词会让类型系统产生虚假的安全感。
- 跨网络、存储、URL 参数等边界数据不能只靠静态缩窄,必须有真实运行时验证。
工程落点
- 接口层和状态机代码非常依赖判别联合与守卫来避免分支爆炸。
- 良好的守卫设计能减少
as断言滥用,并让错误更早暴露在编译期。