In Brief
你正在尝试使用victor
就好像它是一个 es6 模块,但事实并非如此。我看到两个选择:
Let tsc
将您的模块转换为如下格式commonjs
, 在这种情况下tsc
将在之间提供必要的粘合逻辑victor
和你的代码
或者您需要通过提供粘合剂的模块加载器来加载您的应用程序。
详细说明
当我运行最新的tsc
通过您显示的导入,我得到的错误是:
该模块只能通过打开“esModuleInterop”标志并引用其默认导出来使用 ECMAScript 导入/导出来引用。
当我开机时esModuleInterop
,然后就可以正常工作了。这是我使用的测试代码:
import Victor from "victor";
const foo = new Victor(1, 2);
console.log(foo.y);
And the tsconfig.json
:
{
"compilerOptions": {
"esModuleInterop": true
}
}
这个问题的根源是当你这样做时import Victor from "victor"
您正在询问将通过以下方式导出的值export default...
语句,这是es6模块提供的语法。然而,victor
导出任何对应的内容export default...
。因此必须采取一些措施来弥补这一差距。根据我上面展示的内容,当你编译时,tsc
发出这个:
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
exports.__esModule = true;
var victor_1 = __importDefault(require("victor"));
var foo = new victor_1["default"](1, 2);
console.log(foo.y);
请注意__importDefault
辅助功能。每当 TS 代码想要访问模块导出的内容时,就会使用它export default...
它的作用是检查模块是否声称是 es6 模块。想要导出默认值的 es6 模块已经正确构造,因此如果该模块是 es6 模块,则无需执行任何操作。如果模块不是 es6 模块,则帮助程序会创建一种假模块,其默认导出值是原始模块的值。
由于您提到“针对 ecmascript 模块”,因此有一个重要的警告。如果你使用的话,这个tsconfig.json
:
{
"compilerOptions": {
"esModuleInterop": true,
"module": "es6"
}
}
那么发出的代码是:
import Victor from "victor";
var foo = new Victor(1, 2);
console.log(foo.y);
请注意,不再有任何辅助函数。模块加载器将为您的应用程序加载模块,以提供与__importDefault
。如果我将文件重命名为mjs
扩展并运行:
$ node --experimental-modules test.mjs
我得到这个输出:
(node:18394) ExperimentalWarning: The ESM module loader is experimental.
2
当使用带有实验模块支持的 Node 时,它提供与__importDefault
.
当你刚刚使用allowSyntheticDefaultImports
不使用esModuleInterop
你告诉编译器assume你的工具链中会有一些东西可以完成以下工作__importDefault
。所以编译器不提供帮助器。它允许编译继续进行,但是you稍后负责使用模块加载器来执行与__importDefault
.