为何我的TypeScript交叉类型(Intersections)无法正常工作?
解决TypeScript交叉类型与联合类型的混淆问题
首先得明确你搞错了交叉类型(&)的作用——交叉类型不是把两个联合类型合并成更大的联合,而是取它们的交集。
看你的代码:
Combinable是string | number,表示值可以是字符串或数字;Numeric是number | boolean,表示值可以是数字或布尔值;- 当你用
Combinable & Numeric时,TypeScript会找同时属于两个类型的取值,也就是只有number。所以Universal其实等价于number类型,这就是为什么你给x赋值字符串会报错,给add传字符串参数也会报错。
如果你想要的是合并两个联合类型的所有可能值(string | number | boolean)
那应该用**联合类型(|)**而不是交叉类型:
type Combinable = string | number; type Numeric = number | boolean; // 用 | 实现并集,包含string、number、boolean三种类型 type Universal = Combinable | Numeric; let x: Universal; x = 2; // ✅ 正常 x = "2"; // ✅ 正常 x = true; // ✅ 正常
修正add函数的问题
改成联合类型后,直接用a + b会报错,因为TypeScript无法确定a和b到底是字符串还是数字。需要加类型守卫来区分处理:
function add(a: Universal, b: Universal) { // 同时是字符串时做拼接 if (typeof a === 'string' && typeof b === 'string') { return a + b; } // 同时是数字时做加法 if (typeof a === 'number' && typeof b === 'number') { return a + b; } // 类型不匹配时抛出错误或做其他处理 throw new Error('参数必须同时为字符串或同时为数字'); } add(1, 2); // ✅ 返回3 add("1", "2"); // ✅ 返回"12" // add(1, "2"); // ❌ 抛出错误,符合预期
为什么视频里的交叉类型能正常工作?
大概率视频里的交叉类型是针对对象类型的,比如两个对象类型交叉会合并它们的属性:
type User = { name: string }; type Age = { age: number }; type UserWithAge = User & Age; // 等价于 { name: string; age: number }
这种场景下交叉类型是合并属性,和你用在联合类型上的逻辑完全不同,这是你混淆的核心原因。
内容的提问来源于stack exchange,提问作者Ivan Telizhenko
相关产品推荐
相关产品推荐

