У меня есть объект, который требует группировки определенных опций. Таким образом, либо ни один из них не передан, либо оба переданы. Обычно я добавляю это во вложенное свойство, но не могу изменить форму этого объекта.
В приведенном ниже примере есть обязательный 'a', необязательный 'b', но тогда 'c' и 'd' должны быть предоставлены либо оба, либо ни один из них.
type Basic = {
a: string,
b? string, // independant
c?: boolean, // if c is given, d must also be given
d?: (e: boolean) => void, // if d is given, c must also be given
}
Я пытался сделать какой-нибудь причудливый Typescript, но, похоже, я еще недостаточно хорош, чтобы разбираться в продвинутых вещах.
type GroupedOptional<T> = {
[K in keyof T]: undefined;
} & Required<T>
type Fancy = {
a: string,
b?: string,
} & GroupedOptional<{
c: boolean,
d: (e: boolean) => void,
}>;






Это должно работать:
type AllOrNothing<T> = T | Partial<Record<keyof T, undefined>>
type Fancy = {
a: string,
b?: string,
} & AllOrNothing<{
c: boolean,
d: (e: boolean) => void,
}>;
let t1:Fancy = { a: ""}
let t2:Fancy = { a: "", c: true} // err
let t3:Fancy = { a: "", c: true, d: (e)=> {}} // ok
Все или ничего создает союз между исходным T и Partial, который заставляет, если свойства присутствуют, они должны быть undefined (фактически запрещая их)
ААААА... Я пробовал что-то подобное, но это не удалось, я не обернул никогда часть в
PartialиPartialкажется ключом к тому, чтобы заставить это работать. Спасибо.