根据一些业务规则,我创建了一个聚合函数,需要正确输入.
函数(JS):
它需要:
- 初始对象.
-
n
件物品.
export function aggregateObjects(initialObject, ...newObjects) {
const aggregate = (objectA, objectB) => {
return Object.keys(objectB).reduce(
(acc, key) => ({
...acc,
[key]: [...(acc[key] ?? []), ...(objectB[key] ?? [])],
}),
objectA
);
};
return newObjects.reduce(
(aggregatedObjects, newObject) => aggregate(aggregatedObjects, newObject),
initialObject
);
}
如何使用它(Typescript ):
下面是传递给aggregateObjects
的两个新对象的示例,但它应该适用于5、10、...
const initialObject = {
a: [objectOfType1],
};
const newObject1 = {
a: [objectOfType2],
b: [objectOfType1],
};
const newObject2 = {
c: [objectOfType1, objectOfType2],
};
const result = aggregateObjects(initialObject, [newObject1, newObject2]);
我们所期望的(Typescript ):
根据前面的示例,我们预期结果如下:
-
a
的类型应为ObjectType1
或ObjectType2
的array. -
b
的类型应为ObjectType1
的array. -
c
的类型应为ObjectType1
或ObjectType2
的array.
type Result = {
a: (ObjectType1 | ObjectType2)[];
b: ObjectType1[];
c: (ObjectType1 | ObjectType2)[];
};
我try 了什么(Typescript ):
当然,它不起作用:
- 内部
aggregate
看起来没问题(即使有一些与传播相关的问题). - 在外部,我没有找到正确输入返回值的解决方案.
请注意,CombineObjs
是受https://dev.to/svehla/typescript-how-to-deep-merge-170c启发的TS帮助器
export function aggregateObjects<T extends object, U extends any[]>(
initialObjects: T,
...newObjects: U
) {
const aggregate = <A extends object, B extends object>(
objectA: A,
objectB: B
): CombineObjs<A, B> => {
return (Object.keys(objectB) as Array<keyof B>).reduce(
(acc, key) => ({
...acc,
[key]: [
// @ts-ignore
...(acc[key as keyof CombineObjs<A, B>] ?? []),
// @ts-ignore
...(objectB[key] ?? []),
],
}),
objectA as unknown as CombineObjs<A, B>
);
};
return newObjects.reduce(
(aggregatedObjects, newObject) => aggregate(aggregatedObjects, newObject),
initialObjects
);
}
感谢您的解决方案.