为何TypeScript中导入该JS模块时会带有default属性?
问题:导入自定义i18n模块后得到
{ default: [Getter] }而非预期对象 模块代码(./esm/locale/en.js)
import cardinal from '../rules/rule5'; import ordinal from '../rules/rule42'; var pluralRule = { ordinal: ordinal, cardinal: cardinal, }; export default pluralRule;
package.json导出配置
{ "exports": { "./en": { "default": "./esm/locale/en.js", } } }
项目中的TypeScript使用代码
// 项目中的某个.ts文件 import en from 'custom-i18n/en'; console.log(en); // 输出:{ default: [Getter] }
原因分析
问题出在package.json的exports配置与模块解析逻辑的冲突:
- 你的模块是ES模块(使用
export default导出),但exports配置仅指定了"default"条件,未明确对应ES模块的"import"场景。 - 当TypeScript或Node.js的模块加载器识别到这种配置时,会默认将模块当作CommonJS模块处理。此时ES模块的
default导出会被自动映射到CommonJS模块的exports.default属性,导致你导入的en是包含defaultgetter的包装对象,而非直接拿到目标pluralRule。
解决方案
方案1:修正package.json的exports配置
明确添加"import"条件匹配ES模块导入场景,同时保留"default"作为兼容 fallback:
{ "exports": { "./en": { "import": "./esm/locale/en.js", "default": "./esm/locale/en.js" } } }
若模块全部为ES模块,可直接简化配置:
{ "exports": { "./en": "./esm/locale/en.js" } }
方案2:标记模块为ES模块
在自定义i18n模块的package.json中添加"type": "module",告知Node.js所有.js文件均为ES模块:
{ "type": "module", "exports": { "./en": "./esm/locale/en.js" } }
方案3:临时调整导入写法(不推荐长期使用)
若暂时无法修改依赖的package.json,可通过调整导入语句获取目标对象:
import { default as en } from 'custom-i18n/en'; // 或者 import * as enModule from 'custom-i18n/en'; const en = enModule.default;
内容的提问来源于stack exchange,提问作者Yanick Rochon
相关产品推荐
相关产品推荐

