联合与交叉类型

在 TypeScript 中,联合类型和交叉类型是处理多个类型合并和交叉的强大工具。

联合类型

联合类型(Union Types)使用 | 操作符来定义,表示一个值可以是几种类型之一。

1let age: number | string = 20; // age 可以是 number 或 string 类型

这类似于 JavaScript 中的逻辑或 ||,但用于类型系统,表示变量可以取指定的任一类型。

交叉类型

交叉类型(Intersection Type)使用 & 操作符来定义,它将多个类型合并为一个类型,合并后的类型包含所有成员类型的特性。

1let m : string & number;
2// 思考这里有一个值满足m的类型要求吗?
3// 这在实际中是无意义的,因为没有任何值可以同时是 string 和 number 类型
4
5let zs: { name: string; age: number } & { height: number } = {
6  name: "张三",
7  age: 20,
8  height: 180,
9};

在这个例子中,zs 同时拥有了两个对象类型的所有属性。

联合与交叉组合使用

联合和交叉类型可以组合使用,这就需要考虑操作符的优先级。通常情况下,& 的优先级高于 |,但可以通过小括号 () 来调整优先级。

1let m: ({ id: number } & { name: string }) | ({ id: string } & { name: number })
2m = {
3	id: 1,
4	name: "",
5}
6
7m = {
8	id: "",
9	name: 1,
10}

在这个例子中,m 可以是两个类型之一:一个具有数字 id 和字符串 name 的对象,或者是一个具有字符串 id 和数字 name 的对象。