Skip to content

Merge is not distributive #1323

@TastyPi

Description

@TastyPi
type Foo = { foo: "bar" } | { bar: "foo" };
type Bar = { foo: "baz" } | { baz: "qux" };

({ foo: "baz" }) satisfies Merge<Foo, Bar>;

results in error:

error TS1360: Type '{ foo: "baz"; }' does not satisfy the expected type 'Merge<Foo, Bar>'.
  Type '{ foo: "baz"; }' is not assignable to type '{ bar: "foo"; foo: "baz"; } | { bar: "foo"; baz: "qux"; } | { bar: "foo"; foo: "baz"; } | { bar: "foo"; baz: "qux"; } | { bar: "foo"; foo: "baz"; } | { bar: "foo"; baz: "qux"; } | { bar: "foo"; foo: "baz"; } | { bar: "foo"; baz: "qux"; }'.
    Property 'bar' is missing in type '{ foo: "baz"; }' but required in type '{ bar: "foo"; foo: "baz"; }'.

15 ({ foo: "baz" }) satisfies Merge<Foo, Bar>;

However, this does work:

type DistributedMerge<
  A extends object,
  B extends object,
> = A extends object ? (B extends object ? Merge<A, B> : never) : never;

type Foo = { foo: "bar" } | { bar: "foo" };
type Bar = { foo: "baz" } | { baz: "qux" };

({ foo: "baz" }) satisfies DistributiveMerge<Foo, Bar>;

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions