Аргумент типа ‘unknown’ не может быть присвоен параметру типа ‘string’ с array.includes()

#reactjs #typescript

#reactjs #typescript

Вопрос:

Есть несколько похожих вопросов, но моя ситуация иная. Я работаю над текстовым редактором, и это мой код:

 const LIST_TYPES = ["numbered-list", "bulleted-list"];


const toggleBlock = (editor: Editor, format: string) => {
  const isActive = isBlockActive(editor, format);
  const isList = LIST_TYPES.includes(format);
  // Wrap nodes at the specified location in the element container. If no location is specified, wrap the selection.
  Transforms.unwrapNodes(editor, {
    match: (n: Node) =>
      LIST_TYPES.includes(
        !Editor.isEditor(n) amp;amp; SlateElement.isElement(n) amp;amp; n.type
      ),
    split: true,
  });
  const newProperties: Partial<SlateElement> = {
    type: isActive ? "paragraph" : isList ? "list-item" : format,
  };
  Transforms.setNodes(editor, newProperties);

  if (!isActive amp;amp; isList) {
    const block = { type: format, children: [] };
    Transforms.wrapNodes(editor, block);
  }
};
 

match() принимает Node в качестве аргумента. Я передал правильный тип. Однако в этом выражении !Editor.isEditor(n) amp;amp; SlateElement.isElement(n) amp;amp; n.type , когда я навожу курсор на каждое состояние, .isEditor(n) , .isElement(n) и n.type выдает мне то же предупреждение: «Аргумент типа ‘unknown’ не может быть присвоен параметру типа ‘string'», хотя я передал правильный тип в качестве аргумента. Я не понимаю, откуда берется «unknown».

это тип для unwrapNodes()

 unwrapNodes(editor: import("..").Editor, options: {
        at?: import("..").Path | import("..").Point | import("..").Range | undefined;
        match?: ((node: import("..").Node) => boolean) | undefined;
        mode?: "highest" | "lowest" | "all" | undefined;
        split?: boolean | undefined;
        voids?: boolean | undefined;
    }): void;
 

Я думаю, что проблема в includes() . Каким-то образом он не оценивает это !Editor.isEditor(n) amp;amp; SlateElement.isElement(n) amp;amp; n.type . Потому что это работает : match: (n: Node) => LIST_TYPES.includes(n.type as string)

Комментарии:

1. Что такое Editor ?

2. Что такое Transformes.unwrapNodes ? Не могли бы вы, пожалуйста, поделиться воспроизводимым примером?

3. @ritaj Я просыпаюсь в текстовом редакторе. редактор представляет полный документ в текстовом редакторе. Похоже, я не вставил полную функцию. я обновляю вопрос

4. @captain-yossarian Я обновляю вопрос с помощью unwrapNodes.

Ответ №1:

Я думаю, что я понял, просто обернув логический оператор и присвоив его как string

 Transforms.unwrapNodes(editor, {
    match: (n: Node) =>
      LIST_TYPES.includes(
        (!Editor.isEditor(n) amp;amp; SlateElement.isElement(n) amp;amp; n.type) as string
      ),
    split: true,
  });