You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:45:02