我問這個問題的原因是因爲我在official document about module看到下面的句子。在Typescript中,模塊的類型是什麼?
該模式的核心思想是導入id = require(「...」) 語句使我們可以訪問模塊公開的類型。
我完全困惑。爲什麼模塊有一個類型?爲什麼require()可以給我們模塊暴露的類型?
我問這個問題的原因是因爲我在official document about module看到下面的句子。在Typescript中,模塊的類型是什麼?
該模式的核心思想是導入id = require(「...」) 語句使我們可以訪問模塊公開的類型。
我完全困惑。爲什麼模塊有一個類型?爲什麼require()可以給我們模塊暴露的類型?
在運行時,爲了導入它的另一個模塊,模塊是一個JavaScript對象,每個導出都有一個屬性。該對象上的一組屬性概述了模塊的類型。當然,TypeScript可以在編譯時知道這些屬性的類型,就像它可以知道其他對象一樣。
但是從模塊自己的角度來看,它是一個函數,它被執行以將屬性添加到傳遞給它的對象exports
。一般來說,exports
對象成爲其進口商的模塊。
如果這看起來很奇怪,那麼我們需要看一下模塊的目的,即限制它的成員範圍。在JavaScript中,限制你定義的東西的主要方式是在函數中定義它。
由TypeScript生成的模塊的函數的確切形式取決於您選擇的加載器選項。例如,使用CommonJS模塊(由NodeJS使用),模塊的函數會由加載程序自動包裝爲.js文件的內容。對於Node.js的是功能一般是這樣的:
(function (exports, require, module, __filename, __dirname) {
<<JavaScriptFileContent>>
\n});
由於模塊加載過程的一部分,Node.js的編譯此匿名函數,然後調用它,傳遞的(幾乎)空的JavaScript對象exports
,該require()
函數等。通常,中間的代碼通過向exports
對象添加屬性來工作。
這不是完整的故事,它可能是一個模塊是別的東西。如果中間的代碼爲module.exports
指定了其他內容,則該對象將成爲運行時模塊對象。這不是很常見。