Вместо того, чтобы думать о «взаимном включении» этих параметров вместе, лучше думать об этом как об «изгнании их» от других.
type Status = 'running' | 'finished' | 'error' | 'inherited'
type Pipeline = Array<{
name: string
status: Exclude<Status, 'inherited'>
} | {
name: string
status: 'inherited'
parent: string
}>
Конечно, для более сложных схем , это имеет тот недостаток, что теперь вам нужно повторять множество полей.
Чтобы справиться с этим, вы можете собрать общие поля и наследовать от них с помощью оператора &
.
type Common = {
name: string
lots: string
of: string
metadata: string
}
type Pipeline = Array<Common & ({
status: Exclude<Status, 'inherited'>
} | {
status: 'inherited'
parent: string
})>
Хотя это поможет в проверке типов, абстракция делает фактический тип более непрозрачным в окне проверки ошибок.