esModuleInterop:Emit '__importStar' and '__importDefault' helpers for runtime babel ecosystem compatibility and enable '--allowSyntheticDefaultImports' for typesystem compatibility. Requires TypeScript version 2.7 or later.

Typescript:tsconfig.json

看着说是为了与运行时babel兼容才使用的选项,想着我又没有用babel啊然后就关掉了。

结果就是,在import json的时候返回是undefined。

const config = require('../../config.json');
exports.config = config.default;
/*config是json的原始文本(即未经过JSON.parse()),
那自然default就会undefined*/

搜索了一下,首先显示node.js在很早的时候就已经原生支持require json了,另外发现jest的仓库那里有个老哥碰到了这个问题然而没人理他。

既然问题出在import上,那如果我直接用CommonJS形式的require()呢?抱着这个想法试了试,我的JSON成功读取出来了。

十分开心地继续写,把index.ts里的业务代码解注释以后结果告诉我:

let server = net_1.default.createServer(); ^

TypeError: Cannot read property 'createServer' of undefined
at Object.startNegativly (\GitHub\CQ-msg-forwarder\dist\lib\main.js:14:32)
at Object. (\GitHub\CQ-msg-forwarder\dist\index.js:12:12)
at Module._compile (internal/modules/cjs/loader.js:959:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
at Function.Module._load (internal/modules/cjs/loader.js:727:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
at internal/main/run_main_module.js:17:11
[nodemon] app crashed - waiting for file changes before starting…

??????'net'不是你们nodejs的内部库吗?

然后我才发现问题估计不是出在刚刚的引用方式上。于是想了一下刚刚做了什么改动,先是'target'设置回'es6',然后噢~ 估计是这个'esModuleInterop'的问题。

开回来以后就没事了,めでたしめでたし

其实还是不了解Typescript背后ESModule转换成CommonJS的机制,还以为一切都是静态搞定了的,结果其实是静态(指在js文件里添加代码)搞定的嘛(

当我在修改我三个月前写的代码时