С учетом следующего:
interface A {
a: number;
c: number;
}
interface B{
b: boolean;
c: number;
}
Выражение типа объединения A | B
присваивается либо A
, либо B
. Он должен иметь свойства A
или B
(или обоих)
const oA: A | B = {
a: 6,
c: 6
}
const oB: A | B = {
b: true,
c: 6
}
const oC: A | B = {
a: 6,
b: true
c: 6
}
Но какие операции имеет тип, подобный A | B
? Только те, которые принадлежат как A
, так и B
oA.c = 1; // valid
Тип пересечения A & B
, если он назначается как A, так и B (и, следовательно, должен иметь свойства как A, так и B).
const obj: A & B = {
a: 6,
b: true
}
Обновление
Вы спрашиваете "почему A & B в вашем примере может брать b prop? Его нельзя назначить типу A"
Это явно не правда. Любой тип, который имеет все свойства A, может быть назначен A. Дополнительные свойства не причиняют вреда:
const aAndExtraProp = {
a: 6,
d: 6
};
const ca0: A = aAndExtraProp;
Возможно, вас смущают Проверка избыточного свойства для литералов объекта:
Литералы объектов получают специальную обработку и при go проверяются лишние свойства при назначении их другим переменным или передаче их в качестве аргументов. Если у литерала объекта есть какие-либо свойства, которых нет у «целевого типа», вы получите ошибку:
const ca1: A = {
a: 6,
d: 6 //ERROR
};