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

React.js中非默认属性ControlType动态导入报错问题求助

问题

在React.js中,我们通常这样导入BraftEditor及其非默认导出的ControlType:

import BraftEditor, { ControlType } from 'braft-editor'

对于默认导出的BraftEditor,可以通过以下方式实现无SSR动态导入:

const BraftEditorNoSSR = dynamic(import('braft-editor'), {ssr: false})

但尝试用类似方式动态导入非默认属性ControlType时:

const ControlType = dynamic(() =>
  import('braft-editor').then(lib => lib.ControlType), {ssr: false}
);

出现了类型错误:

./DraftEditor.tsx:11:42
Type error: Property 'ControlType' does not exist on type 'typeof import("/project/node_modules/braft-editor/index")'.

   9 | const BraftEditor = dynamic(import('braft-editor'), {ssr: false})
  10 | const ControlType = dynamic(() =>
> 11 |   import('braft-editor').then(lib => lib.ControlType), {ssr: false}
     |                                          ^
  12 | );
  13 | const CLASS_NAME = 'MuiEditor-root'
  14 | const useStyles = makeStyles((theme: Theme) => ({
npm ERR! Lifecycle script `build` failed with error: 
npm ERR! Error: command failed 
npm ERR!   in workspace: @app/lib@0.0.1 
npm ERR!   at location: /project/packages/lib 

请问该如何正确动态导入非默认属性ControlType?

解决方案

方法1:包装目标属性为默认导出

dynamic函数要求导入的模块返回React组件或包含default导出的对象,直接返回ControlType不符合要求,且会触发TypeScript类型检测报错。正确做法是在回调中返回包含该属性的对象,将其设为default导出:

const ControlTypeModule = dynamic(() =>
  import('braft-editor').then(lib => ({ default: lib.ControlType })), 
  { ssr: false }
);
// 使用时直接引用 ControlTypeModule 即可

方法2:一次性导入所有所需成员

如果同时需要BraftEditor和ControlType,可以在一次动态导入中获取所有需要的导出,既简洁又能避免类型问题:

const EditorModule = dynamic(() =>
  import('braft-editor').then(lib => ({
    default: lib.default,
    ControlType: lib.ControlType
  })),
  { ssr: false }
);
// 使用示例:
// const BraftEditor = EditorModule.default;
// const ControlType = EditorModule.ControlType;

方法3:修正TypeScript类型声明

若报错由TypeScript类型检测导致,可检查braft-editor的类型定义是否完整,或手动扩展类型声明:
在项目的types目录下创建braft-editor.d.ts文件,添加如下内容:

declare module 'braft-editor' {
  // 替换为更精确的类型以保证类型安全
  export const ControlType: any;
  export default function BraftEditor(props: Record<string, any>): JSX.Element;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:01:07