Вы должны сделать свой союз из i1 | i2
эксклюзивным. Есть два способа сделать это.
Вручную
Это гарантирует, что y
и z
никогда не могут существовать на i1
.
interface i1 {
x: number;
y?: never;
z?: never;
}
Одно только это изменение даст нам желаемую ошибку.
Используя помощника
Мы можем создать помощника, который делает то же самое, но может использоваться повторно .
type DistributedKeyOf<T> =
T extends any
? keyof T
: never;
type CreateExclusiveUnion<T, U = T> =
T extends any
? T & Partial<Record<Exclude<DistributedKeyOf<U>, keyof T>, never>>
: never;
type ExclusiveUnion<T> = CreateExclusiveUnion<T>;
Использование:
const oa: ExclusiveUnion<i1 | i2> = {
x: 1,
y: 2,
}