このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

構文とか機能とか 2

  1. 内部モジュールってあったけど、今でもあるのか? あるようだ。名前空間としてのオブジェクトの使い方を組織化しただけだが、使い勝手はいい。
  2. 同じ名前の内部モジュールを複数回書けて、それらがアペンドされるって仕様はどうよ?
  3. 内部モジュールのimport構文が import foo = モジュール修飾付きパスだったけど、最近のESモジュール仕様と整合するのか? ともかくも今でも使える。名前空間の奥にあるモノを代入するだけ。
  4. キーワードmoduleの代わりにnamespaceを使えるし、使うべき -- いわゆるモジュールと混乱するのでヨロシクナイから。
  5. ESでは動的インポートもサポートされるようだ、喜ばしい: https://qiita.com/tonkotsuboy_com/items/f672de5fdd402be6f065
  6. AMD方式のインポートは、import sub = require(パス); (パスに拡張子は入れない)。
  7. リファレンスパス方式 ///<reference path="拡張子付きパス"/> これはどうも、HTMLの を模倣する方式らしい。reference@path を script@src に直すだけだから、ある意味理解しやすい。仕掛けはC言語のincludeに近く、テキスト処理。が、構文が気持ち悪すぎる。
  8. AMD方式はたぶん滅ぶだろう。リファレンスパス方式も汚すぎる。
  9. 結局、新しいESモジュール方式の方向に行くだろう。
  10. Noe.jsで使っている方式を、歴史的経緯からCommonJS方式(CJS)と呼んでいるらしい。
  11. AMDとCJSがどれほど違うか、よく知らん。
  12. が、もうESモジュールでいいや、AMDだのCJSだの知らんわ。

内部モジュール(=名前空間)の仕組み:

module Foo {

    export function foo(i:number, b:boolean) : number {
        return 0;
    }

}
module Foo {
    var baz = 1;
}
import foo = Foo.foo;

コンパイル後:

var Foo;
(function (Foo) {
    function foo(i, b) {
        return 0;
    }
    Foo.foo = foo;
})(Foo || (Foo = {}));
(function (Foo) {
    var baz = 1;
})(Foo || (Foo = {}));
var foo = Foo.foo;

moduleよりnamespeceを使うことにしよう。

[追記]tscの -m KIND, --module KIND オプションのヘルプを見ると、モジュール方式は、

  1. 'none'
  2. 'commonjs'
  3. 'amd'
  4. 'system'
  5. 'umd'
  6. 'es2015'
  7. 'ESNext'

違いはいずれ調べよう。

[/追記]