Расширьте интерфейс и извлеките оригинальный интерфейс снова - PullRequest
0 голосов
/ 07 февраля 2019

То, что я пытаюсь сделать, - это расширение интерфейса, который может иметь или не иметь свойство «полезной нагрузки», например:

type Extended<T> = T extends { payload: any }
  ? {
      [K in keyof T]: K extends 'payload'
      ? { id: string; originalPayload: T[K] }
      : T[K]
    }
  : T & { payload: { id: string } }

."свойство нового типа формы

interface Payload {
  id: string;
  originalPayload?: "typeof originalPayload" // only if there was an original payload
}

Позже в коде я хочу извлечь реквизит" id "из нового типа и восстановить старый тип с помощью чего-то вроде

const { payload: { id, originalPayload = undefined }, ...rest } = varOfNewType
const varOfOldType = {
  ...rest,
  ...(originalPayload !== undefined ? { payload: originalPayload } : {}),
}

Но я получаю ошибку, похожую на

Свойство 'originalPayload' не существует для типа 'T extends {payload: any;}?{id: строка;originalPayload: T ["полезная нагрузка"];}: {id: string;} '.

Я полностью потерян и не знаю, как это сделать правильно.Также пробовал по-другому, например, как

type Extended<T> = { [prop in Exclude<keyof T, 'payload'>]: T[prop] } & {
  payload: T extends { payload: any }
    ? { id: string; originalPayload: T['payload'] }
    : { id: string };
};

, но ничего не работает.: (

Чтобы дать некоторый контекст: Я играю с Redux и у меня плоское состояние с "коллекциями", которые являются картами типа id => Entity. Я такжеесть редукторы для отдельных сущностей. Я пытаюсь составить редуктор коллекции, который вызывает редуктор одной сущности для сущности с правильным идентификатором и просто возвращает все остальные сущности в коллекции, как они есть. Для этого мне нужно обогатить исходное действие так,он имеет идентификатор в своей полезной нагрузке, а затем возвращает исходное действие для передачи одному редуктору сущности.

Я хотел бы либо найти решение для моей первоначальной проблемы, либо получить предложения по улучшениюподход на то, что я пытаюсь сделать в целом. Заранее большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...