交叉类型(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类型包含name和age两个基础属性
Worker类型包含company和position两个工作属性通过
&合并后,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 };扩展现有类型:在不修改原类型的前提下,为类型添加新属性 / 方法
组合多个功能模块:将独立的类型(如日志、定时器、用户信息)合并为一个完整类型
替代多接口实现:比 implements 更灵活的对象类型组合方式
核心符号:& 表示交叉类型,作用是合并多个类型的所有成员;
赋值规则:必须包含所有合并类型的属性和方法,缺一不可;
冲突规则:同名属性类型不兼容时,会变为 never 类型,无法使用;
核心特点:交叉类型 = 同时拥有,联合类型 = 二选一。