diff --git a/lib/util/assign-keys.spec.ts b/lib/util/assign-keys.spec.ts new file mode 100644 index 00000000000000..f0299197f593c7 --- /dev/null +++ b/lib/util/assign-keys.spec.ts @@ -0,0 +1,18 @@ +import { assignKeys } from './assign-keys'; + +describe('util/assign-keys', () => { + it('should assign values from right to left for specified keys', () => { + type Left = { a: number; b: number }; + const left: Left = { a: 1, b: 2 }; + + type Right = { a?: number; b?: number; c?: number }; + const right: Right = { a: 3, c: 4 }; + + const result = assignKeys(left, right, ['a', 'b']); + expect(result).toEqual({ + a: 3, + b: 2, + }); + expect(result).toBe(left); + }); +}); diff --git a/lib/util/assign-keys.ts b/lib/util/assign-keys.ts new file mode 100644 index 00000000000000..fe2fe12e0efd98 --- /dev/null +++ b/lib/util/assign-keys.ts @@ -0,0 +1,18 @@ +import is from '@sindresorhus/is'; + +/** + * Assigns non-nullish values from `right` to `left` for the given `keys`. + */ +export function assignKeys< + Left extends { [key in K]?: Right[key] }, + Right extends { [key in K]?: any }, + K extends keyof Right +>(left: Left, right: Right, keys: K[]): Left { + for (const key of keys) { + const val = right[key]; + if (!is.nullOrUndefined(val)) { + left[key] = val; + } + } + return left; +}