TypeScript ES模块环境下如何正确使用.default导入?
解决ES模块下导入bip32/ecpair无法获取工厂函数的问题
以下是几种无需切换到CommonJS的解决思路:
1. 显式访问.default并适配TypeScript类型
由于这两个包本质是CommonJS导出,ES模块导入时会被包裹成带default属性的对象。TypeScript报错是因为类型定义未同步适配,可通过类型断言绕过:
import * as BIP32Factory from 'bip32'; import * as ECPairFactory from 'ecpair'; // 用类型断言告诉TS这是一个含default的对象 const bip32 = (BIP32Factory as { default: typeof BIP32Factory }).default; const ecPair = (ECPairFactory as { default: typeof ECPairFactory }).default; console.log(typeof bip32); // 输出"function" bip32(ecc); // 正常调用
如果觉得any太宽泛,也可以手动定义工厂函数的类型来替换断言。
2. 在ES模块中直接使用require
Node.js的ES模块环境原生支持require,直接用CommonJS风格导入就能拿到预期的函数:
const BIP32Factory = require('bip32'); const ECPairFactory = require('ecpair'); console.log(typeof BIP32Factory); // 输出"function"
这种写法无需额外配置,打包工具(如webpack、Vite)也能正常处理。
3. 更新或修复类型定义
问题大概率出在@types/bip32和@types/ecpair的类型定义未适配ES模块导入。先尝试更新类型包:
npm install @types/bip32@latest @types/ecpair@latest --save-dev
如果更新后仍无效,可以手动修改node_modules/@types/bip32/index.d.ts,在模块声明末尾添加export default BIP32;,让TypeScript识别默认导出。
4. 用打包工具自动转换
如果项目使用webpack、Rollup等工具,配置对应的CommonJS转换插件(比如Rollup的@rollup/plugin-commonjs),工具会自动将CommonJS导出转换为ES模块兼容的默认导出,这样就能直接用import BIP32Factory from 'bip32'的写法调用函数。
内容的提问来源于stack exchange,提问作者dill
相关产品推荐
相关产品推荐

