联合与交叉类型
在 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
的对象。