type StripUndefined = { [K in keyof T as T[K] extends undefined ? never : K]: T[K]; }; export function omitUndefined(obj: T | undefined) { return Object.fromEntries( Object.entries(obj || {}).filter(([, value]) => value !== undefined), ) as StripUndefined; } export function mergeOptions( source1: T, source2?: U, source3?: V, ) { return Object.assign({}, omitUndefined(source1), omitUndefined(source2), omitUndefined(source3)); }