diff --git a/source/merge-deep.d.ts b/source/merge-deep.d.ts index 5903811ad..58ee468bd 100644 --- a/source/merge-deep.d.ts +++ b/source/merge-deep.d.ts @@ -33,7 +33,7 @@ type MergeDeepRecordProperty< Source, Options extends MergeDeepInternalOptions, > = undefined extends Source - ? MergeDeepOrReturn, Exclude, Options> | undefined + ? MergeDeepOrReturn, Exclude, Options> | (undefined extends Destination ? undefined : never) : MergeDeepOrReturn; /** @@ -58,7 +58,7 @@ type DoMergeDeepRecord< } // Case in rule 3: Both the source and the destination contain the key. & { - [Key in keyof Source as Key extends keyof Destination ? Key : never]: MergeDeepRecordProperty; + [Key in keyof Source as Key extends keyof Destination ? Key : never]: MergeDeepRecordProperty[Key], Required[Key], Options>; }; /** diff --git a/test-d/merge-deep.ts b/test-d/merge-deep.ts index e0e4b4944..979fa7f23 100644 --- a/test-d/merge-deep.ts +++ b/test-d/merge-deep.ts @@ -309,3 +309,19 @@ expectType<[Bar, FooBarReplace, ...FooBarReplace[]]>(tupleIntoTupleWithVariadicR declare const tupleIntoTupleWithVariadicReplaceReversed: MergeDeep<[Foo, ...Foo[]], [number, Bar, ...Bar[]], {arrayMergeMode: 'replace'; recurseIntoArrays: true}>; expectType<[number, FooBarReplace, ...FooBarReplace[]]>(tupleIntoTupleWithVariadicReplaceReversed); + +type RecordNotPartial = { + name: string; + type: string; + b: {bb?: string; cc: string}; +}; +type RecordPartial = Partial; + +expectType({} as MergeDeep); +expectType({} as MergeDeep); + +type NotOptional = {a: string; b: number; c: boolean}; +type OptionalWithUndefined = {a: string | undefined; b?: number; c?: boolean | undefined}; + +expectType({} as MergeDeep); +expectType({} as MergeDeep);