我问这个问题的原因是因为我在official document about module中看到了以下句子。
模式的核心思想是import id = require(" ...") statement使我们可以访问模块公开的类型。
我完全糊涂了。为什么模块有类型?为什么require()可以给我们模块公开的类型?
答案 0 :(得分:2)
在运行时,对于导入它的另一个模块,模块是一个JavaScript对象,具有每个导出的属性。该对象上的属性集概述了模块的类型。当然,TypeScript可以在编译时知道这些属性的类型,就像它可以了解其他对象一样。
但是从模块自己的角度来看,它是一个被执行的函数,用于向传递给它的exports
对象添加属性。一般来说,exports
对象成为其导入者的模块。
如果这看起来很奇怪,那么我们需要看看模块的目的,即限制其成员的范围。在JavaScript中,限制您定义的内容范围的主要方法是在函数内定义它。
TypeScript生成的模块的确切函数形式取决于您选择的加载程序选项。例如,使用CommonJS模块(由NodeJS使用),模块的功能由加载器自动包装在.js文件的内容中。对于正常运行的Node.js,如下所示:
(function (exports, require, module, __filename, __dirname) {
<<JavaScriptFileContent>>
\n});
作为模块加载过程的一部分,Node.js编译此匿名函数,然后调用它,为exports
传递(几乎)空的JavaScript对象,require()
函数等。通常中间的代码通过向exports
对象添加属性来工作。
这不是完整的故事,它可能使模块成为别的东西。如果中间的代码为module.exports
分配了其他内容,则该对象将成为运行时模块对象。这不常见。