Типы объединения и пересечения TypeScript

TypeScript предоставляет мощные функции системы типов, которые помогают вам писать более безопасный и предсказуемый код. Среди этих функций — типы объединения и пересечения, которые обеспечивают гибкость в определении и управлении сложными типами. В этой статье представлены эти концепции и приведены примеры для иллюстрации их использования.

Какие существуют типы профсоюзов?

Типы объединений позволяют переменной хранить значения разных типов. Это полезно, когда вам нужно представить значение, которое может быть одним из нескольких типов. Типы объединений обозначаются с помощью символа | (вертикальная черта).

Определение типов объединений

Чтобы определить тип объединения, необходимо указать несколько типов, разделенных символом |:

let value: string | number;

value = "Hello, TypeScript"; // Valid
value = 42; // Valid
value = true; // Error: Type 'boolean' is not assignable to type 'string | number'

В этом примере переменная value может быть либо string, либо number, но не boolean.

Использование типов объединений в функциях

Типы объединений особенно полезны в функциях, где параметры или возвращаемые типы могут быть нескольких типов:

function formatValue(value: string | number): string {
  if (typeof value === "string") {
    return value.toUpperCase();
  } else {
    return value.toFixed(2);
  }
}

console.log(formatValue("hello")); // Output: HELLO
console.log(formatValue(123.456)); // Output: 123.46

Функция formatValue принимает параметр, который может быть либо string, либо number, и форматирует его соответствующим образом.

Что такое типы пересечений?

Типы пересечений позволяют объединять несколько типов в один. Это означает, что значение типа пересечения будет удовлетворять всем типам в пересечении. Типы пересечений обозначаются с помощью символа & (амперсанд).

Определение типов пересечений

Чтобы определить тип пересечения, необходимо указать несколько типов, разделенных символом &:

interface Person {
  name: string;
}

interface Employee {
  employeeId: number;
}

type EmployeePerson = Person & Employee;

const john: EmployeePerson = {
  name: "John Doe",
  employeeId: 1234
};

console.log(john.name); // Output: John Doe
console.log(john.employeeId); // Output: 1234

В этом примере тип EmployeePerson объединяет интерфейсы Person и Employee, в результате чего получается тип, имеющий свойства name и employeeId.

Использование типов пересечения в функциях

Типы пересечения также можно использовать в функциях, требующих несколько свойств типа:

function printEmployeeDetails(employee: Person & Employee): void {
  console.log(`Name: ${employee.name}`);
  console.log(`Employee ID: ${employee.employeeId}`);
}

const jane: EmployeePerson = {
  name: "Jane Smith",
  employeeId: 5678
};

printEmployeeDetails(jane);
// Output:
// Name: Jane Smith
// Employee ID: 5678

Функция printEmployeeDetails требует аргумент, который удовлетворяет обоим типам Person и Employee.

Объединение типов объединения и пересечения

Вы можете комбинировать типы объединения и пересечения для создания сложных определений типов:

type Shape = Circle | Rectangle;

interface Circle {
  kind: "circle";
  radius: number;
}

interface Rectangle {
  kind: "rectangle";
  width: number;
  height: number;
}

function getArea(shape: Shape): number {
  if (shape.kind === "circle") {
    return Math.PI * shape.radius * shape.radius;
  } else {
    return shape.width * shape.height;
  }
}

const myCircle: Circle = { kind: "circle", radius: 10 };
const myRectangle: Rectangle = { kind: "rectangle", width: 20, height: 30 };

console.log(getArea(myCircle)); // Output: 314.159...
console.log(getArea(myRectangle)); // Output: 600

В этом примере тип Shape представляет собой объединение Circle и Rectangle, а функция getArea обрабатывает оба типа соответствующим образом.

Заключение

Типы объединения и пересечения в TypeScript предоставляют мощные способы управления и комбинирования типов, предлагая гибкость и точность в определениях типов. Типы объединения позволяют переменной быть одним из нескольких типов, тогда как типы пересечения объединяют несколько типов в один. Используя эти функции, вы можете создавать более надежные и безопасные по типу приложения.

Попрактикуйтесь в использовании типов объединения и пересечения, чтобы освоиться с их возможностями и улучшить свои навыки программирования на TypeScript.