TypeScript内部モジュール

今は「名前空間〈namespace〉」に変わり、これも推奨はされてないようだが、内部モジュールという仕掛けもある。グローバルモジュール(include方式)も内部モジュールも、ESM以前のナンチャッテモジュールのメカニズムを採用している。

手動で書いていた

var foo = foo || {};
var = function() {
  // ...
}

を次の形で書く。

module foo {
  // ...
}

実際のコンパイル結果は:

var foo;
(function (foo) {
 }) ( foo || (foo = {}) );

var の繰り返し選言が可能であることを利用して、定義のマージができる。いわゆる「開いたモジュール」を実現する。どこからでもいつでもモジュールに追加ができる。

ESM方式とは別だが、ファイル内に階層的名前空間を書けること、別ファイルから同一内部モジュールを定義できることなどがメリット(同時にデメリット)だろう。