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