假设有一个函数X
,它接受任意数量的对象:
export function X<T extends object[]>(...classes: T): MergedClasses<T>;
我希望它返回该列表中每个对象的交集。
例如,给定对象 A
、B
、C
和 D
它将类似于:
let X = A & B
X = X & C
X = X & D
// for any number of objects
但是,我想将其作为函数返回类型的类型(因此 MergedClasses
)
type MergedClasses<C extends object[]> = {
}
我知道可以执行 [K for keyof C]:
但从那里我不确定如何组合对象,因为无法分配变量。
我查看了 Lodash 的 merge typings它只是一个重载函数,需要 1、2、3、4 或 5 个对象。所以看起来它可以合并任意数量的对象,但实际上不能合并超过 5 个对象。
是否可以动态合并对象,或者我必须采取与 Lodash 相同的路线?
最佳答案
这是使用递归定义的解决方案:
type IntersectionOf<A extends any[]> = A extends [infer T, ...infer R] ? T & IntersectionOf<R> : unknown
// type Test = {a: string} & {b: number} & {c: boolean}
type Test = IntersectionOf<[{a: string}, {b: number}, {c: boolean}]>
这里有一个替代的、稍微困惑的解决方案,使用 this answer 中的 UnionToIntersection
帮助程序。 ,如果第一个解决方案遇到编译器的递归限制,这可能会更好。但是,请注意,如果任何输入类型是并集,这将产生不正确的行为,因为它们也会转换为交集。
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
type IntersectionOf<A extends any[]> = UnionToIntersection<A[number]>
// type Test = {a: string} & {b: number} & {c: boolean}
type Test = IntersectionOf<[{a: string}, {b: number}, {c: boolean}]>
关于Typescript 泛型循环遍历对象数组并与它们相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67475386/