Typescript 泛型循环遍历对象数组并与它们相交

标签 typescript typescript-generics

假设有一个函数X,它接受任意数量的对象:

export function X<T extends object[]>(...classes: T): MergedClasses<T>;

我希望它返回该列表中每个对象的交集。 例如,给定对象 ABCD 它将类似于:

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}]>

Playground Link

这里有一个替代的、稍微困惑的解决方案,使用 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}]>

Playground Link

关于Typescript 泛型循环遍历对象数组并与它们相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67475386/

相关文章:

angular - "tsc.exe"以代码 1 退出

typescript :使用泛型函数获取嵌套对象的值

javascript - 我可以使用 TypeScript 在 axios.get 方法中的泛型类型中指定任何类型

http - Angular2如何清空可观察流

css - 如何在 bootstrap-vue modal[b-modal] 上创建过渡/动画

typescript - Typescript 中每个文件的显式全局变量

typescript - 从对象推断类型中的类型

Angular 在 View 呈现之前设置 Array[]

typescript - 推断回调参数的类型

typescript - 将函数返回值定义为读取对象中路径的类型