From f049774e2bd6574817e6b316bf045850d47e1674 Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Fri, 21 Jul 2023 11:46:59 +0300 Subject: [PATCH] fix: Better types for `assignKeys` utility (#23496) --- lib/util/assign-keys.spec.ts | 31 ++++++++++++++++++++++++------- lib/util/assign-keys.ts | 4 ++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/util/assign-keys.spec.ts b/lib/util/assign-keys.spec.ts index f0299197f593c7..43afe38d306001 100644 --- a/lib/util/assign-keys.spec.ts +++ b/lib/util/assign-keys.spec.ts @@ -2,16 +2,33 @@ 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 Left = { + foo: number | string; + bar: number | boolean; + baz?: number; + }; + const left: Left = { + foo: 'foo', + bar: false, + baz: 42, + }; - type Right = { a?: number; b?: number; c?: number }; - const right: Right = { a: 3, c: 4 }; + type Right = { + foo?: number; + bar?: number; + baz?: number; + }; + const right: Right = { + foo: 1, + bar: 2, + baz: 3, + }; - const result = assignKeys(left, right, ['a', 'b']); + const result = assignKeys(left, right, ['foo', 'bar']); expect(result).toEqual({ - a: 3, - b: 2, + foo: 1, + bar: 2, + baz: 42, }); expect(result).toBe(left); }); diff --git a/lib/util/assign-keys.ts b/lib/util/assign-keys.ts index fe2fe12e0efd98..eaf0d3d460b518 100644 --- a/lib/util/assign-keys.ts +++ b/lib/util/assign-keys.ts @@ -4,8 +4,8 @@ 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 }, + Left extends { [key in K]?: unknown }, + Right extends { [key in K]?: Left[key] }, K extends keyof Right >(left: Left, right: Right, keys: K[]): Left { for (const key of keys) {