Модификация объединённых объектов удаляет условные свойства
Доброго времени суток!
Имеем пример набора типов:
type BaseFigure = { color: string | number }
type Line = { type: 'line', x1: number, x2: number, y1: number, y2: number }
type Dot = { type: 'dot', x: number, y: number }
type Figure = BaseFigure & (Line | Dot)
Если мы захотим исключить общее свойство color, то ожидаем увидеть Line | Dot, но в результате получим { type: 'line' | 'dot' }, что не есть наши мечты.
Если же мы после этого всё же попробуем его использовать по назначению, то получим ошибку:
type FigureWithoutColor = Omit<Figure, 'color'>
const a: Figure = { color: 'white', type: 'dot' }
// В типе "{ color: string; type: "dot"; }" отсутствуют следующие свойства из типа "Dot": x, y ts(2322)
const c: FigureWithoutColor = { type: 'dot', x: 1, y: 2 }
// Объектный литерал может использовать только известные свойства. "x" не существует в типе "FigureWithoutColor" ts(2322)
Сталкивались ли с подобным и как решали? Сам пока вижу из вариантов только описывать заранее generic-типы для подобных операции, что не удобно:
type FigureWithout<K> = Omit<BaseFigure, K> & (Omit<Line, K> | Omit<Dot, K>)