我正在尝试扩展接口,该接口可能具有或不具有“有效载荷”属性,如下所示:
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,然后取回原始操作以移交给单个实体化简器。
我很乐意为我的原始问题找到解决方案,或者就一般性尝试获得更好的方法的建议。提前非常感谢您!