Типы - Union, Intersection
Чем в TypeScript можно заменить наследование? Как указать сразу диапазон типов? Ответы на эти вопросы вы сможете получить прочитав до конца данную главу.
Тип Объединение (Union Types)
Объединение (Union
) - это мощный механизм позволяющий создавать из множества существующих типов логическое условие по которому данные могут принадлежать только к одному из указанных типов. Объединение указывается с помощью оператора прямой черты |
, по обе стороны которой располагаются типы данных.
let v1: T1 | T2 | T3;
Переменной, которой был указан тип объединения A
или B
или C
, может быть присвоено значение, принадлежащие к одному из трех типов.
class A {
a: number;
}
class B {
b: string;
}
class C {
c: boolean;
}
let identifier: A | B | C; // значение может принадлежать только одному типу (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; // значение должно принадлежать ко всем типам одновременно