Опциональные группы внутри TypeScript - PullRequest
0 голосов
/ 09 июля 2019

У меня есть объект, для которого нужно сгруппировать определенные опции. Так что либо ничего не пропущено, либо оба пропущены. Обычно я добавляю это к вложенному свойству, но не могу изменить форму этого объекта.

В приведенном ниже примере есть обязательное «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,
}>;

1 Ответ

1 голос
/ 09 июля 2019

Это должно работать:

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 (в основном, запрещая их)

...