TypeScript合并N个保留类型的对象

TypeScript合并N个保留类型的对象,typescript,object,generics,merge,Typescript,Object,Generics,Merge,给定任意数量的不同形状的对象,TypeScript是否可以正确断言类型信息 例如: const merge=(…对象)=>{ 返回Object.values(objects.reduce((acc,next)=>({…acc,…next})); } 我的实际用例要比这个复杂得多,但是类型签名将是类似的 以下是可行的方法,但我希望这不是唯一的解决方案: function merge<T1, T2>(...objects: [T1, T2]): T1 & T2; functio

给定任意数量的不同形状的对象,TypeScript是否可以正确断言类型信息

例如:

const merge=(…对象)=>{
返回Object.values(objects.reduce((acc,next)=>({…acc,…next}));
}
我的实际用例要比这个复杂得多,但是类型签名将是类似的

以下是可行的方法,但我希望这不是唯一的解决方案:

function merge<T1, T2>(...objects: [T1, T2]): T1 & T2;
function merge<T1, T2, T3>(...objects: [T1, T2, T3]): T1 & T2 & T3;
function merge(...objects) {
  return Object.values(objects).reduce((acc, next) => ({ ...acc, ...next }));
}
函数合并(…对象:[T1,T2]):T1&T2;
函数合并(…对象:[T1,T2,T3]):T1&T2&T3;
函数合并(…对象){
返回Object.values(objects.reduce((acc,next)=>({…acc,…next}));
}
我的问题是,它无法使用较新版本的TypeScript进行编译,并且根本不可维护


有没有更好的方法来实现这一点?

经过几轮实验后,这里有一个解决方案,虽然有效-我仍然希望看到一些改进:

function merge<R>(...objects: Partial<R>[]): R {
  return Object.values(objects).reduce((acc, next) => ({ ...acc, ...next }));
}
函数合并(…对象:部分[]):R{
返回Object.values(objects.reduce((acc,next)=>({…acc,…next}));
}

它从另一个方面解决了这个问题-定义返回类型和签名可以限定返回内容的任何部分实现。

经过几轮实验后,这里有一个解决方案,尽管可行-我仍然希望看到一些改进:

function merge<R>(...objects: Partial<R>[]): R {
  return Object.values(objects).reduce((acc, next) => ({ ...acc, ...next }));
}
函数合并(…对象:部分[]):R{
返回Object.values(objects.reduce((acc,next)=>({…acc,…next}));
}

它从另一方面解决了这个问题-定义返回类型和签名限定了返回内容的任何部分实现。

这里有一个更简单的实现函数的方法是使用
Object.assign(),还有一种更复杂的方法来键入函数,由于可以推断泛型类型,因此该方法工作得更好:


下面是一种实现函数的更简单方法,即使用
Object.assign()
,以及一种更复杂的方法来键入函数,因为可以推断出泛型类型,因此效果更好:


这不是我一直在挣扎的语法,事实上,如果你看我的例子,同样的是通过
T1&T2…
实现的。这不是我一直在挣扎的语法,事实上如果你看我的例子,同样的是通过
T1&T2…
实现的。
const y = merge({ foo: 5 }, { foo: 'world' });
// const y: {
//     foo: number;
// } & {
//     foo: string;
// }
// But should be { foo: string }