То, что я пытаюсь сделать, - это расширение интерфейса, который может иметь или не иметь свойство «полезной нагрузки», например:
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
. Я такжеесть редукторы для отдельных сущностей. Я пытаюсь составить редуктор коллекции, который вызывает редуктор одной сущности для сущности с правильным идентификатором и просто возвращает все остальные сущности в коллекции, как они есть. Для этого мне нужно обогатить исходное действие так,он имеет идентификатор в своей полезной нагрузке, а затем возвращает исходное действие для передачи одному редуктору сущности.
Я хотел бы либо найти решение для моей первоначальной проблемы, либо получить предложения по улучшениюподход на то, что я пытаюсь сделать в целом. Заранее большое спасибо!