TypeScript, определяющий ключ и значение для объекта, вероятно, с объединением дискриминации - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу определить, какой тип значения разрешен внутри объекта, на основе определенного интерфейса / типа:

type StorageValuesSyncOptions = {
  toDoOrNotToDo: boolean,
  piecesOfEight: number,
  poem: string,
};

type SyncOptions<Options extends StorageValuesSyncOptions = StorageValuesSyncOptions> = {
  [key in keyof Options]: SyncOption<Options, Options[key]>;
};

type SyncOption<K, V> = {
  id: keyof K,
  value: V,
};

Пока я использую SyncOptions, у меня есть гарантия, что 'SyncOption' в формате, указанном в StorageValuesSyncOptions. Однако я хочу вывести sh из универсальных SyncOption, чтобы он был заблокирован таким образом. Я думаю, что мне нужно использовать дискриминационное объединение, и было бы неплохо использовать значение по умолчанию, поэтому мне не нужно было указывать родовые типы.

В качестве примера это работает, как и ожидалось:

const options: SyncOptions = {
  toDoOrNotToDo: {
    id: 'toDoOrNotToDo',
    value: true, //3 will result in an error
  },
  piecesOfEight: {
    id: 'piecesOfEight',
    value: 7, //"string" will result in an error
  },
  poem: {
    id: 'poem',
    value: "You and me", // true will not work
  },
};

Я хотел бы, чтобы это привело к ошибке:

  const poem: SyncOption = {
    id: 'poem',
    value: true //"but a string" should be valid
  },
...