Перейти к содержанию

Union, Intersection

Чем в TypeScript можно заменить наследование? Как указать сразу диапазон типов? Ответы на эти вопросы вы сможете получить прочитав до конца данную главу.

Тип Объединение

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

let v1: T1 | T2 | T3;

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

class A {
  a: number;
}
class B {
  b: string;
}
class C {
  c: boolean;
}

// значение может принадлежать только одному типу (A или B или C)
let identifier: A | B | C;

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

class Bird {
  fly(): void {}

  toString(): string {
    return 'bird';
  }
}

class Fish {
  swim(): void {}

  toString(): string {
    return 'fish';
  }
}

class Insect {
  crawl(): void {}

  toString(): string {
    return 'insect';
  }
}

function move(animal: Bird | Fish | Insect): void {
  animal.fly(); // Error
  animal.swim(); // Error
  animal.crawl(); // Error

  animal.toString(); // ок, задекларировано во всех типах
}

Тип Пересечение (Intersection Type)

Пересечение (Intersection) — ещё один мощный механизм TypeScript, который позволяет рассматривать множество типов данных как единое целое. Пересечение указывается с помощью оператора амперсанда &, по обе стороны которого указываются типы данных.

let v1: T1 & T2 & T3;

Переменной, которой был указан тип пересечение A и B и С, должно быть присвоено значение, принадлежащее к типам A и B и C одновременно. Другими словами, значение должно обладать всеми обязательными признаками каждого типа, определяющего пересечение.

class A {
  a: number;
}
class B {
  b: string;
}
class C {
  c: boolean;
}

let name: A & B & C; // значение должно принадлежать ко всем типам одновременно