【问题标题】:TypeScript "import { myVar }" syntax seems to be incorrectly compiling in a Node/CommonJS/ES5 appTypeScript "import { myVar }" 语法似乎在 Node/CommonJS/ES5 应用程序中编译不正确
【发布时间】:2017-06-05 13:15:36
【问题描述】:

在我的 Node 应用程序中,我有一个设置文件,它将一些设置导出为如下对象:

// settings.ts
export var settings = {
    port: 1234
}

在另一个文件中,我导入这些设置并尝试引用port 属性:

// another-file.ts
import { settings } from './settings';
console.log(settings.port);

此代码编译正确,但在运行时出现以下错误:

Cannot read property 'port' of undefined

当我检查编译后的代码时,我可以看到正在发生这种情况,因为我上面的第二个文件正在编译为:

var settings_1 = require("./settings");
console.log(settings_1.settings.port);

如果我使用调试器浏览编译后的代码,我可以看到settings_1 变量指向从settings.ts 导出的值。换句话说,我的port 财产位于settings_1.port位于settings_1.settings.port。看来 TypeScript 编译器应该生成这个 JavaScript 代码:

var settings = require("./settings");
console.log(settings.port);

我做错了吗?还是 TypeScript 编译器错误地编译了我的导入?

我知道 TypeScript 编译器正在正确地对我的导入进行类型检查;如果我这样做:

import { settings } from './settings';
console.log(settings.propertyThatDoesNotExist);

我收到 propertyThatDoesNotExist 不存在的编译器错误。

我正在使用 TypeScript 2.3.2,以“es5”为目标并输出“commonjs”模块,在 Node 6.9.2 上运行。

【问题讨论】:

  • 也许我遗漏了一些东西,但你的代码对我来说似乎是正确的。也许值得在 TypeScript 的 GitHub 问题跟踪器上提出这个问题?
  • 编译后的导入代码看起来不错,但是编译后的导出代码是什么样的呢?从打字稿代码来看,它确实应该提供一个带有.settings 变量的模块对象。

标签: javascript node.js typescript ecmascript-6 es6-modules


【解决方案1】:

想通了。这是我的一个愚蠢的错误(不是总是这样吗?)。我正在将应用程序从 JavaScript 转换为 TypeScript,我将 settings.js 复制并重命名为 settings.ts... 但我没有删除 settings.js。结果,我实际上导入了我的旧 settings.js 文件,该文件的导出设置不同。

删除settings.js 后,我的应用程序使用.ts 文件正确启动,并且我的导入按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多