我有一个接受未知对象的函数,我想输出它们的合并版本:
export function merge(...objects: any[]) {
return objects.reduce((acc, current) => {
acc = {
...acc,
...current
}
return acc;
}, {});
}
const a = { name: '' };
const b = { id: 1 };
const c = { prop: '' };
const result = merge(a, b, c);
Run Code Online (Sandbox Code Playgroud)
如何result根据传递的对象自动推断变量的类型?
该objects阵列组件类型是个体对象类型的结合,和你的结果是一样的交点,所以在这里是使用从联盟到交叉点转化的溶液此答案。
type UnionToIntersection<U> =
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never
type Merge<A extends any[]> = UnionToIntersection<A[number]>
Run Code Online (Sandbox Code Playgroud)
用法:
function merge<A extends any[]>(...objects: A): Merge<A> {
// ...
}
const result = merge({ a: 1 }, { b: 'foo' }, { c: 2, d: 'bar' });
// result: { a: number } & { b: string } & { c: number, d: string }
Run Code Online (Sandbox Code Playgroud)
结果实际上等同于{ a: number, b: string, c: number, d: string }但不幸的是 Typescript 并没有简化它。
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |