diff --git a/lib/util/assign-keys.spec.ts b/lib/util/assign-keys.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f0299197f593c7f2816a16d655bbde25ba295c19
--- /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 0000000000000000000000000000000000000000..fe2fe12e0efd9852075583f780ad16bb7822b49a
--- /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;
+}