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; // значение должно принадлежать ко всем типам одновременно