You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React新手使用react-draft-wysiwyg时遇TypeScript类型错误:属性‘blockStyleFn’不存在于指定类型中

修复react-draft-wysiwyg中blockStyleFn的TypeScript类型错误

我之前也碰到过这个问题,本质是react-draft-wysiwyg的官方TypeScript类型定义里默认没有包含blockStyleFn的属性声明,导致TS无法识别这个Draft.js原生支持的配置项。下面给你两种可行的修复方案:

方案1:扩展Editor组件的类型定义(推荐)

我们可以通过TypeScript的声明合并特性,给react-draft-wysiwyg的EditorProps接口新增blockStyleFn的类型声明,让TS正确识别这个属性。

你可以在项目根目录创建一个react-draft-wysiwyg.d.ts类型声明文件,或者直接在TextEditor.tsx的顶部添加以下代码:

import { ContentBlock } from 'draft-js';
import { EditorProps } from 'react-draft-wysiwyg';

declare module 'react-draft-wysiwyg' {
  interface EditorProps {
    // 匹配Draft.js blockStyleFn的类型:接收ContentBlock,返回样式类名或空值
    blockStyleFn?: (contentBlock: ContentBlock) => string | null | undefined;
  }
}

这段代码会告诉TypeScript,EditorProps接口新增了blockStyleFn这个可选属性,完全对齐Draft.js原生的函数类型,之后TS就不会再报错了。

方案2:临时类型断言(快速绕过校验)

如果只是想快速解决问题、跳过类型检查,可以给Editor组件做类型断言,强制TS接受这个属性:

<Editor
  spellCheck
  editorState={editorState}
  onEditorStateChange={onEditorStateChange}
  toolbar={toolbar}
  editorStyle={{height: "500px" }}
  blockStyleFn={myBlockStyleFn}
/> as React.ReactElement<EditorProps & { blockStyleFn: typeof myBlockStyleFn }>

不过这种方式不推荐长期使用,因为会失去TypeScript的类型校验优势,还是方案1更规范。

小优化建议

另外,你的myBlockStyleFn函数目前只处理了code-block类型,最好加上默认返回值,避免返回undefined可能导致的样式异常:

function myBlockStyleFn(contentBlock: ContentBlock) {
  const type = contentBlock.getType();
  if (type === 'code-block') {
    return 'customBlock';
  }
  // 添加默认返回值,确保函数始终返回字符串
  return '';
}

内容的提问来源于stack exchange,提问作者Hanna Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:17:32