在 TypeScript 中,&
和 |
分别用于创建交叉类型(Intersection Types)和联合类型(Union Types),它们是 TypeScript 类型系统中的核心概念。
交叉类型(&
)
交叉类型是将多个类型合并为一个类型,这意味着新类型将具有所有成员类型的特性。这在你想要组合多个类型的属性到一个类型中时非常有用。
typescript
type A = { a: string };
type B = { b: number };
type C = A & B;
let example: C = { a: "hello", b: 42 }; // 正确
在上面的例子中,类型 C
是类型 A
和 B
的交叉,因此 C
类型的对象 example
必须包含 a
属性(来自 A
)和 b
属性(来自 B
)。
联合类型(|
)
联合类型表示一个值可以是几种类型之一。它用于表示一个值可以属于多个类型中的任何一个。
typescript
type D = string | number;
let value: D;
value = "test"; // 正确
value = 123; // 正确
value = true; // 错误,`boolean` 不是 `string | number`
在上面的例子中,类型 D
是 string
和 number
的联合,意味着变量 value
可以赋值为字符串或数字。
区别
- 交叉类型 (
&
) 合并多个类型的属性,创建出一个包含所有属性的单一类型。如果不同类型中存在同名属性但类型不兼容,交叉类型将无法正确形成(结果为never
类型),因为没有任何类型可以同时是这些不兼容的类型。 - 联合类型 (
|
) 表示一个值可以是多种类型中的任何一种。在使用联合类型的值时,你只能访问所有成员类型共有的属性或方法。
在实际应用中,你可能会需要在对象类型、函数参数、返回值等多种地方使用这两种类型。选择使用哪一种取决于你的具体需求:是否需要组合类型(&
)还是需要一个值可以是多种类型之一(|
)。