2016-09-24 12 views
2

私がこの質問をするのは、official document about moduleに次の文章があるからです。Typescriptでは、モジュールの種類は何ですか?

このパターンのコアアイデアは、import id = require( "...") ステートメントは、モジュールによって公開される型にアクセスできるようにすることです。

私は完全に混乱しています。なぜモジュールに型があるのですか? require()がモジュールによって公開される型を与える理由は何ですか?

答えて

2

実行時に、モジュールをインポートする別のモジュールでは、モジュールはエクスポートごとにプロパティを持つJavaScriptオブジェクトです。そのオブジェクトのプロパティのセットは、モジュールのタイプの概要を示します。もちろん、TypeScriptは他のオブジェクトについて知ることができるように、コンパイル時にこれらのプロパティの型を知ることができます。

しかし、モジュール自身の観点からは、渡されたオブジェクトexportsにプロパティを追加するために実行される関数です。一般に、exportsオブジェクトは、その輸入者のモジュールになります。

もしそれが奇妙に思えば、モジュールの目的を見る必要があります。モジュールの目的はメンバーの範囲を限定することです。 JavaScriptでは、定義しているものの範囲を制限する主な方法は、関数内で定義することです。

TypeScriptで生成されるモジュールの関数の形式は、選択したローダオプションによって異なります。例えばCommonJSモジュール(NodeJSで使用)では、モジュールの関数は自動的にローダによって.jsファイルのconentsにラップされます。 Node.jsのために機能するには、通常、次のようになります。モジュールのロードプロセスの一環として、Node.jsのは、この無名関数をコンパイル

(function (exports, require, module, __filename, __dirname) { 
    <<JavaScriptFileContent>> 
\n}); 

、その後exports、のために(ほぼ)空のJavaScriptオブジェクトを渡し、それを呼び出しますrequire()関数などです。通常、中間のコードは、exportsオブジェクトにプロパティを追加することによって動作します。

それはモジュール全体が何か他のものになる可能性があります。途中のコードがmodule.exportsに何か他のものを割り当てると、そのオブジェクトはランタイムモジュールオブジェクトになります。これはあまり一般的ではありません。

関連する問題