# 联合类型

可以把 | 类比为 JavaScript 中的逻辑或 ||,只不过前者表示可能的类型。

满足其一即可

// 既可以是数字也可以是字符串
let age: number | string = 20;
age = "20";

// 1 | "2" 在这里是类型,代表常量。所以num的值只能为 1 或者 "2"
let num: 1 | "2" = 1;
num = "2";

// | 表示要么有a属性,要么有b属性,要么a、b都有
let obj: { a: 1 } | { b: "2" };
obj = { a: 1 };
obj = { b: "2" };
obj = { a: 1, b: "2" };

# 交叉类型

把多个类型合并成一个类型,合并后的类型将拥有所有成员类型的特性。使用 & 操作符来声明交叉类型(并集)。

必须全部满足

// 思考这里有一个值满足m的类型要求吗?
let m: string & number; // 不会有任何值满足这个类型 一般不会这么写

let obj1: { name: string; age: number } & { height: number } = {
  name: "张三",
  age: 20,
  height: 180,
};

// 如果一个属性出现多次类型设置,需要都满足
let obj2: { age: number } & { age: 18 } = {
  age: 18,
};

# 联合交叉类型

联合、交叉类型本身就可以直接组合使用,这就涉及 |、& 操作符的优先级问题。

联合操作符 | 的优先级低于交叉操作符 &,同样,我们可以通过使用小括弧 () 来调整操作符的优先级,这个和 js 一样。

let m: ({ id: number } & { name: string }) | ({ id: string } & { name: number });
m = {
  id: 1,
  name: "",
};

m = {
  id: "",
  name: 1,
};