Как описать OR логику в интерфейсах?

В TypeScript для описания OR логики в интерфейсах можно использовать объединение типов с помощью оператора "|" (вертикальная черта).

При объединении типов с помощью оператора "|", данные могут соответствовать любому из указанных типов. Если данные соответствуют хотя бы одному из типов объединения, то они считаются валидными.

Допустим, у нас есть два интерфейса A и B:

interface A {
  propA: string;
}

interface B {
  propB: number;
}

Чтобы задать OR логику, мы можем создать новый интерфейс, объединяющий A и B:

interface C {
  propA: string;
  propB: number;
}

Теперь объект, имеющий свойства из интерфейса A или B будет соответствовать интерфейсу C:

const obj1: C = {
  propA: "Hello",
  propB: 42
}; // валидно

const obj2: C = {
  propA: "World",
  propB: 3.14
}; // валидно

Однако, объект, который не соответствует ни A, ни B не будет валидным:

const obj3: C = {
  propA: "Test"
}; // ошибка: свойство "propB" отсутствует

const obj4: C = {
  propB: 123
}; // ошибка: свойство "propA" отсутствует

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

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