diff --git a/.changeset/lucky-guests-suffer.md b/.changeset/lucky-guests-suffer.md new file mode 100644 index 0000000000..3f6e50e218 --- /dev/null +++ b/.changeset/lucky-guests-suffer.md @@ -0,0 +1,6 @@ +--- +"effect": patch +--- + +- Make `MergeRight`, `MergeLeft` and `MergeRecord` in `Types` module homomorphic (preserve original `readonly` and optionality modifiers) +- `MergeRecord` now is alias for `MergeLeft` diff --git a/packages/effect/dtslint/Types.ts b/packages/effect/dtslint/Types.ts index d90aa81376..ef5b568ddd 100644 --- a/packages/effect/dtslint/Types.ts +++ b/packages/effect/dtslint/Types.ts @@ -63,6 +63,9 @@ hole>() // $ExpectType { a: number; b: number; } hole>() +// $ExpectType { readonly a?: number; b: number; readonly c?: string; } +hole>() + // ------------------------------------------------------------------------------------- // MergeRight // ------------------------------------------------------------------------------------- @@ -70,6 +73,9 @@ hole>() // $ExpectType { a: string; b: number; } hole>() +// $ExpectType { readonly a?: string; b: number; } +hole>() + // ------------------------------------------------------------------------------------- // Mutable // ------------------------------------------------------------------------------------- diff --git a/packages/effect/src/Types.ts b/packages/effect/src/Types.ts index 423c8ce414..2785fade80 100644 --- a/packages/effect/src/Types.ts +++ b/packages/effect/src/Types.ts @@ -156,11 +156,7 @@ export type Has = (Key extends infer K ? K extends keyof * @since 2.0.0 * @category models */ -export type MergeLeft = Simplify< - { - [k in keyof K | keyof H]: k extends keyof K ? K[k] : k extends keyof H ? H[k] : never - } -> +export type MergeLeft = MergeRight /** * Merges two object where the keys of the right object take precedence in the case of a conflict. @@ -172,9 +168,10 @@ export type MergeLeft = Simplify< * @since 2.0.0 * @category models */ -export type MergeRight = Simplify< - { - [k in keyof K | keyof H]: k extends keyof H ? H[k] : k extends keyof K ? K[k] : never +export type MergeRight = Simplify< + & Source + & { + [Key in keyof Target as Key extends keyof Source ? never : Key]: Target[Key] } > @@ -182,12 +179,7 @@ export type MergeRight = Simplify< * @since 2.0.0 * @category models */ -export type MergeRecord = { - [k in keyof K | keyof H]: k extends keyof K ? K[k] - : k extends keyof H ? H[k] - : never -} extends infer X ? X - : never +export type MergeRecord = MergeLeft /** * Describes the concurrency to use when executing multiple Effect's.