export type Overwrite = { [K in keyof (T & U)]: K extends keyof U ? U[K] : K extends keyof T ? T[K] : never; }; type AllMerged = Objects extends [infer T, infer U, ...infer Rest] ? AllMerged<[Overwrite, ...Rest]> : Objects extends [infer T, ...infer Rest] ? T : Objects extends (infer Rest)[] ? Rest : never; export const merge = (objects: T): AllMerged => Object.assign(Object.create(null), ...objects); export const scopes = (...scopes: string[]) => scopes.join(' ');