在Typescript中,模块的类型是什么?

时间:2016-09-24 01:10:06

标签: typescript

我问这个问题的原因是因为我在official document about module中看到了以下句子。

  

模式的核心思想是import id = require(" ...")   statement使我们可以访问模块公开的类型。

我完全糊涂了。为什么模块有类型?为什么require()可以给我们模块公开的类型?

1 个答案:

答案 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分配了其他内容,则该对象将成为运行时模块对象。这不常见。