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

为何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是包含default getter的包装对象,而非直接拿到目标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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:55:20