diff --git a/packages/core/types/src/types/__tests__/definitions/utils/object.d.ts b/packages/core/types/src/types/__tests__/definitions/utils/object.d.ts index 57d78294b6..b2be940da1 100644 --- a/packages/core/types/src/types/__tests__/definitions/utils/object.d.ts +++ b/packages/core/types/src/types/__tests__/definitions/utils/object.d.ts @@ -30,6 +30,9 @@ type Values = Utils.Object.Values<{ foo: 'bar'; bar: 'foo'; foobar: 2 }>; type ValuesNever = Utils.Object.Values; type ValuesContainNever = Utils.Object.Values<{ foo: 'bar'; bar: 'foo'; foobar: never }>; +// Replace +type Replace = Utils.Object.Replace<{ foo: 'bar'; bar: 'foo' }, { foo: 2 }>; + export { // KeysBy KeysByString, @@ -56,4 +59,7 @@ export { Values, ValuesNever, ValuesContainNever, + + // Replace + Replace, }; diff --git a/packages/core/types/src/types/__tests__/utils/object.test.ts b/packages/core/types/src/types/__tests__/utils/object.test.ts index ee11fb6c8c..5073ae7d01 100644 --- a/packages/core/types/src/types/__tests__/utils/object.test.ts +++ b/packages/core/types/src/types/__tests__/utils/object.test.ts @@ -77,4 +77,15 @@ describe('Utils.Object', () => { type('ValuesNever').isNever(); type('ValuesContainNever').isUnion([t.stringLiteral('foo'), t.stringLiteral('bar')]); }); + + test.skip('Replace', () => { + // const expectedResultType = t.object({ + // properties: { + // foo: t.numberLiteral(2), + // bar: t.stringLiteral('foo'), + // }, + // }); + // // TODO: Fix object type check + // type('Replace').isObject(expectedResultType); + }); }); diff --git a/packages/core/types/src/types/utils/object.ts b/packages/core/types/src/types/utils/object.ts index 00d763f04e..146f4b2ead 100644 --- a/packages/core/types/src/types/utils/object.ts +++ b/packages/core/types/src/types/utils/object.ts @@ -64,3 +64,15 @@ export type DeepPartial = TObject extends object [TKey in keyof TObject]?: DeepPartial; } : TObject; + +/** + * Replace the keys of an object with the keys of another object + * + * @example + * type X = Replace<{ foo: number, bar: number}, { foo: string }> + * // { foo: string, bar: number } + */ +export type Replace< + TObject extends object, + TNew extends Partial<{ [key in keyof TObject]: unknown }> +> = Omit & TNew;