在Node / CommonJS / ES5应用程序

时间:2017-06-05 13:15:36

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

在我的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”模块,在节点6.9.2上运行。

1 个答案:

答案 0 :(得分:1)

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

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