源本科技 | 码上会

TypeScript 交叉类型

2026/04/14
3
0

引言

交叉类型(Intersection Types)允许我们将多个类型合并成一个新的类型,使用 & 符号表示。这种类型组合可以创建同时拥有多个类型所有特性的对象,是 TypeScript 中实现类型组合的核心方式。

基本概念

交叉类型会合并两个或多个类型的所有属性和方法,生成一个全新的类型。使用该类型的对象,必须包含所有原始类型的成员。

type Person = {
  name: string;
  age: number;
};

type Worker = {
  company: string;
  position: string;
};

// 交叉类型:合并 Person 和 Worker 的所有成员
type Employee = Person & Worker;

// 必须同时包含 4 个属性,缺少任意一个都会报错
const employee: Employee = {
  name: 'John',
  age: 30,
  company: 'ABC Corp',
  position: 'Developer'
};

在这个例子中:

  • Person 类型包含 nameage 两个基础属性

  • Worker 类型包含 companyposition 两个工作属性

  • 通过 & 合并后,Employee 类型拥有全部 4 个属性

  • 赋值时必须满足所有类型的约束,缺一不可

多个类型的合并

交叉类型不局限于两个类型,可以使用 & 连续合并任意数量的类型,最终类型会包含所有参与合并的类型成员。

type Person = {
  name: string;
  age: number;
};

type Worker = {
  company: string;
  position: string;
};

type Address = {
  street: string;
  city: string;
};

// 合并 3 个类型
type DetailedEmployee = Person & Worker & Address;

// 必须包含所有 6 个属性
const detailedEmployee: DetailedEmployee = {
  name: 'John',
  age: 30,
  company: 'ABC Corp',
  position: 'Developer',
  street: '123 Main St',
  city: 'Springfield'
};

方法的交叉

交叉类型不仅可以合并对象的属性,还可以合并方法 / 函数类型,最终的对象必须实现所有合并的方法。

type Logger = {
  log: (message: string) => void;
};

type Timer = {
  start: () => void;
  stop: () => void;
};

// 合并属性与方法
type LoggerTimer = Logger & Timer;

// 必须实现所有方法
const loggerTimer: LoggerTimer = {
  log: (message: string) => console.log(message),
  start: () => console.log('Timer started'),
  stop: () => console.log('Timer stopped')
};

类型冲突处理

交叉类型存在一个关键规则:如果多个类型有同名属性,但类型不一致,合并后该属性类型为 never(表示无法赋值的类型)。

type A = { id: number };
type B = { id: string };

// 同名属性类型冲突:number & string = never
type Conflict = A & B;

// 报错:无法为 never 类型的 id 赋值
// const obj: Conflict = { id: 123 };

使用场景

  1. 扩展现有类型:在不修改原类型的前提下,为类型添加新属性 / 方法

  2. 组合多个功能模块:将独立的类型(如日志、定时器、用户信息)合并为一个完整类型

  3. 替代多接口实现:比 implements 更灵活的对象类型组合方式


总结

  1. 核心符号& 表示交叉类型,作用是合并多个类型的所有成员

  2. 赋值规则:必须包含所有合并类型的属性和方法,缺一不可;

  3. 冲突规则:同名属性类型不兼容时,会变为 never 类型,无法使用;

  4. 核心特点:交叉类型 = 同时拥有,联合类型 = 二选一