Вкратце
Вы пытаетесь использовать victor
, как если бы это был модуль es6, но это не так.Я вижу два варианта:
Позвольте tsc
преобразовать ваши модули в формат, подобный commonjs
, в этом случае tsc
обеспечит необходимую связующую логику между victor
и вашим кодом
Или вам нужно загрузить приложение через загрузчик модулей, который обеспечивает клей.
Подробное объяснение
Когда язапустите последнюю версию tsc
с указанным импортом, я получаю сообщение об ошибке:
На этот модуль можно ссылаться только при импорте / экспорте ECMAScript, включив флаг 'esModuleInterop' и указав ссылку на негоэкспорт по умолчанию.
Когда я включаю esModuleInterop
, то все работает просто отлично.Вот тестовый код, который я использовал:
import Victor from "victor";
const foo = new Victor(1, 2);
console.log(foo.y);
И 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
, вы сообщаете компилятору , что предполагается , что в вашем наборе инструментов будет что-то, чтобудет делать работу __importDefault
.Таким образом, компилятор не предоставляет помощника.Это позволяет продолжить компиляцию, но вы позже будете ответственны за использование загрузчика модулей, который будет выполнять ту же работу, что и __importDefault
.