Skip to content

Typescript: PropsMerge type is invalid. #5490

Closed

Description

@NikitaIT

setNodes: <T extends Node>(
editor: Editor,
props: Partial<T>,
options?: {
at?: Location
match?: NodeMatch<T>
mode?: MaximizeMode
hanging?: boolean
split?: boolean
voids?: boolean
compare?: PropsCompare
merge?: PropsMerge

If we have only one key in props then real type is merge?: (prop: T["key"], node: T["key"]) => T["key"]

Example:

Transforms.setNodes(
                  editor,
                  {
                    key: { value: 1 },
                  },
                  {
                    at: ReactEditor.findPath(editor, leaf),
                    merge(prop: Leaf["key"], node: Leaf["key"]): Leaf["key"] {
                      assert(node.value === 1);
                      return node;
                    },
                  }
                );

Example2:

Transforms.setNodes(
                  editor,
                  {
                    key: "value",
                  },
                  {
                    at: ReactEditor.findPath(editor, leaf),
                    merge(prop: Leaf["key"], node: Leaf["key"]): Leaf["key"] {
                      assert(node === "value");
                      return node;
                    },
                  }
                );

Activity

  1. skorenb commented on Aug 21, 2024

    @skorenb
    Contributor

    merge function has type PropsMerge which is defines as:

    type PropsMerge = (prop: Partial<Node>, node: Partial<Node>) => object

    As we see it expects objects but in setNodes usage of merge doesn't match the type as we pass values key by key:
    packages\slate\src\transforms-node\set-nodes.ts

              if (merge) {
                if (props[<keyof Node>k] != null)
                  newProperties[<keyof Node>k] = merge(
                    node[<keyof Node>k],
                    props[<keyof Node>k]
                  )
              }

    Thus i guess PropsMerge type should expect key and appropriate values of descendant, similar to this:

    type PropsMerge = <TValue extends Descendant[keyof Descendant]>(key: keyof Descendant, prop: TValue, node: TValue) => TValue

    I have no idea how to implement this to get it working with typescript inferring

  2. dylans commented on Oct 10, 2026

    @dylans
    Collaborator

    Fixed by #6137: the merge option's type now accepts and returns any value, so the scalars setNodes passes type-check.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions