typescript无运行时联合或交叉类型判断api,联合类型靠typeof/instanceof/in/字面量守卫实现类型收窄,交叉类型依赖编译期兼容性检查防never,可通过赋值验证和vs code悬停确认类型行为。

TypeScript 本身不提供运行时的“联合类型判断”或“交叉类型判断”API——类型系统在编译后会被擦除,JavaScript 运行时完全不知道 string | number 或 User & Admin 是什么。所谓“判断”,实际是指如何在代码中安全地识别联合类型的当前具体分支(类型收窄),以及如何验证交叉类型是否有效组合(避免退化为 never)。
一、联合类型:靠类型守卫(Type Guards)做运行时识别
联合类型(A | B | C)表示“可能是其中任意一个”,但访问属性前必须确认是哪一个。常用守卫方式:
-
typeof:适用于基础类型判断
例如:if (typeof value === 'string') { value.length; }—— 此时 TypeScript 知道value是string,可安全调用length -
instanceof:适用于类实例
例如:if (data instanceof Error) { data.message; } -
in操作符:适用于对象类型区分
例如:if ('url' in event) { event.url; }(当event是{ url: string } | { id: number }时) -
字面量类型 +
switch或if判断(区分联合)
例如:type Status = 'loading' | 'success' | 'error';,通过if (status === 'success')即可收窄
二、交叉类型:靠编译期检查和显式设计防 never
交叉类型(A & B)不是运行时行为,而是编译期逻辑交集。它不会报错,但可能静默变成 never(即“无合法值”)。关键判断点在同名属性的类型是否兼容:
- 如果
A.id: string且B.id: number→A & B中id类型为string & number→ 结果是never - 如果
A.id: string | number且B.id: string→ 交集为string,合法 - 如果两个类型没有同名属性(如
{ name: string }&{ age: number })→ 安全合并为{ name: string; age: number }
你可以用类型别名配合 type Test = A & B,然后把 Test 赋给一个变量观察是否报错;或者用 type IsNever<t> = [T] extends [never] ? true : false;</t> 辅助检测。
三、快速验证技巧
写完联合或交叉类型后,可以这样快速验证是否按预期工作:
- 对联合类型,尝试只访问各分支独有属性(如
value.toFixed()或value.toUpperCase())—— 若没加守卫就允许,说明类型太宽;若加了守卫仍报错,说明守卫写法不对 - 对交叉类型,新建一个对象字面量赋值给该类型,看是否提示缺失字段或类型冲突 —— 提示
Type 'X' is not assignable to type 'never'就说明组合失败 - 用 VS Code 悬停查看类型提示,直接看到推导出的完整类型,比猜更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











