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

客户端TypeScript报错:apexcharts_1.default不是构造函数,如何解决?

问题

我的项目是运行在浏览器中的TypeScript代码,使用以下tsconfig.json配置转译JavaScript:

{
  "compilerOptions": {
    "target": "es6",                                
    "sourceMap": true,       
    "outDir": "../www/",
    "rootDirs": ["./", "../src"],
    "module": "commonjs",
    "moduleResolution": "node",
    "skipLibCheck": true,
    "allowSyntheticDefaultImports": true       
  },
  "files": [
    "client.ts"
  ],
  "exclude": [
    "node_modules",
    "./node_modules",
    "./node_modules/*",
    "./node_modules/@types/node/index.d.ts",
  ]
}

我在代码中这样使用ApexCharts:

import ApexCharts from 'apexcharts';

// ...其他代码

deviceCard.chart = new ApexCharts(document.querySelector(`#${newCard.serial}chart`), options);
deviceCard.chart.render();

经tsc转译后,代码变为:

deviceCard.chart = new apexcharts_1.default(document.querySelector(`#${newCard.serial}chart`), options);
deviceCard.chart.render();

因为无法从node模块导入ApexCharts到浏览器,我直接下载了ApexCharts的CDN文件到本地,再用browserify打包所有内容。但在浏览器运行时出现报错:

TypeError: apexcharts_1.default is not a constructor

解决方案

方法1:改用全局变量引用

由于你是通过本地文件引入ApexCharts(类似CDN引入逻辑),它会在全局作用域暴露ApexCharts变量,无需使用ES模块导入。修改TypeScript代码:

// 移除import语句,声明全局变量以通过TS类型检查
declare var ApexCharts: any;

// ...其他代码

deviceCard.chart = new ApexCharts(document.querySelector(`#${newCard.serial}chart`), options);
deviceCard.chart.render();

转译后不会生成apexcharts_1.default相关代码,直接调用全局的ApexCharts构造函数。

方法2:调整tsconfig配置适配模块导出

ApexCharts的CommonJS导出未提供default属性,在tsconfig.json的compilerOptions中添加esModuleInterop: true:

{
  "compilerOptions": {
    // ...原有配置
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true       
  }
}

该配置会让TypeScript自动处理CommonJS模块的默认导入逻辑,转译后的代码将兼容无default导出的模块。

方法3:修改导入语句直接取模块导出

若不想调整配置,可修改TypeScript导入方式,直接引用整个模块的导出值:

// 导入整个模块,直接使用模块本身作为构造函数
import * as ApexCharts from 'apexcharts';

// ...其他代码

deviceCard.chart = new ApexCharts(document.querySelector(`#${newCard.serial}chart`), options);
deviceCard.chart.render();

转译后代码会变为new apexcharts_1(...),而非apexcharts_1.default,可正确调用构造函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:35:22