扩展界面并再次提取原始界面

时间:2019-02-07 17:23:46

标签: typescript redux

我正在尝试扩展接口,该接口可能具有或不具有“有效载荷”属性,如下所示:

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 } : {}),
}

但是我收到类似于

的错误
  

类型'T扩展'上不存在属性'originalPayload' }? {id:字符串; originalPayload:T [“ payload”]; }:{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类型的地图。我也有单个实体的减速器。我尝试组成一个集合精简器,该集合精简器在具有正确ID的实体上调用单个实体精简器,并仅按原样返回集合中的所有其他实体。为此,我需要丰富原始操作,以便其有效负载中包含ID,然后取回原始操作以移交给单个实体化简器。

我很乐意为我的原始问题找到解决方案,或者就一般性尝试获得更好的方法的建议。提前非常感谢您!

0 个答案:

没有答案