TypeScript中的交叉类型与联合类型

晨曦之光 2024-05-20 ⋅ 26 阅读

在 TypeScript 中,交叉类型和联合类型是用来处理多个类型的一种机制。交叉类型用于将多个类型合并成一个类型,而联合类型则表示一个值可以是多个类型中的其中一个。

交叉类型

交叉类型使用 & 运算符将多个类型进行合并。例如,我们有一个类型 Person 和一个类型 Worker

type Person = {
  name: string;
  age: number;
};

type Worker = {
  company: string;
  position: string;
};

我们可以使用交叉类型将这两个类型合并成一个新的类型 Person & Worker,表示既是 Person 又是 Worker 的对象:

type PersonWorker = Person & Worker;

const personWorker: PersonWorker = {
  name: "John",
  age: 30,
  company: "ABC Corporation",
  position: "Engineer",
};

在上述例子中,personWorker 对象既具有 Person 类型的属性 nameage,也具有 Worker 类型的属性 companyposition

交叉类型非常适用于组合多个类型的属性集合,常见的应用场景是处理混合对象。例如,我们有一个 Dog 和一个 Bird 类型:

type Dog = {
  name: string;
  breed: string;
};

type Bird = {
  name: string;
  wingspan: number;
};

我们可以使用交叉类型将这两个类型合并成一个新的类型 Animal,表示 DogBird 的共同特征:

type Animal = Dog & Bird;

const animal: Animal = {
  name: "Charlie",
  breed: "Golden Retriever",
  wingspan: 50,
};

在上述例子中,animal 对象既具有 Dog 类型的属性 namebreed,也具有 Bird 类型的属性 wingspan

联合类型

联合类型使用 | 运算符将多个类型进行组合。例如,我们有一个类型 NumberOrString

type NumberOrString = number | string;

表示一个值可以是 number 类型或 string 类型中的其中一个。

let value: NumberOrString;

value = 10; // OK
value = "hello"; // OK
value = true; // Error: Type 'boolean' is not assignable to type 'NumberOrString'

在上述例子中,value 可以是 numberstring 类型的值,但不能是其他类型,例如布尔类型。

联合类型非常适用于表示可能有多种类型的值。例如,我们有一个 Shape 类型:

type Shape = Circle | Square;

type Circle = {
  kind: "circle";
  radius: number;
};

type Square = {
  kind: "square";
  sideLength: number;
};

表示一个图形可以是圆形或正方形。Shape 类型具有一个 kind 属性,根据 kind 属性的值可以确定是圆形还是正方形。

function area(shape: Shape): number {
  switch (shape.kind) {
    case "circle":
      return Math.PI * shape.radius ** 2;
    case "square":
      return shape.sideLength ** 2;
  }
}

在上述例子中,area 函数接受一个 Shape 类型的参数,并根据 kind 属性的值来计算图形的面积。根据 kind 属性的不同,函数可以正确地处理圆形和正方形。

总结

交叉类型和联合类型是 TypeScript 中用于处理多个类型的机制。交叉类型使用 & 运算符将多个类型合并为一个类型,用于表示一个对象具有多个类型的属性。联合类型使用 | 运算符将多个类型组合为一个类型,用于表示一个值可以是多个类型中的其中一个。

交叉类型适用于组合多个类型的属性集合,常用于处理混合对象。联合类型适用于表示可能具有多种类型的值,常用于处理可变类型。

了解和熟练运用交叉类型和联合类型可以让我们更好地处理复杂的类型情况,提高代码的可读性和健壮性。


全部评论: 0

    我有话说: