dtsmとは
dtsmは@vvakameさん製のTypeScript型定義ファイルをいい感じに管理するツール(c.f. JSのnpmやbower,Rubyのbundler).
tsdというデファクトスタンダードみたいなやつもあるが,サブコマンドが難しくて覚えられない….dtsmはサブコマンドがnpmやbower等と同じになってるのでとても良い
詳しくは@vvakameさんのQiita記事参照.
dtmsを利用する上での課題
dtsm.json
がpackage.json
やGemfile
の役割を果たすが,環境によって利用する*.d.ts
を分けることが出来ない(c.f. npmのdevDependencies
, bundlerのgroup :test
).
そして,*.d.ts
はちょっとしたことですぐに競合する(e.g. node/node.d.ts
とangularjs/angular-mocks.d.ts
のmodule
).
こうなると,bundle.d.ts
(dtsm install
したファイルが全部referenceされるやつ)をそのまま読み込むとtscが通らなくなる.
typings/angularjs/angular-mocks.d.ts(21,13): TS2403: Subsequent variable declarations must have the same type. Variable 'module' must be of type '{ exports: any; require(id: string): any; id: string; filename: string; loaded: boolean; parent: ...', but here has type '(...modules: any[]) => any'.
CI環境でdtsm install
を実行すると,bundle.d.ts
が全部上書きされる.これをそのままkarma.conf.js
等で読んでしまうと死ぬことになる(typings
以下をignoreしている場合の話).
対策: dtsm.json
の分割
たとえば,dtsm.json
とdtsm.test.json
に分割する.
karma.conf.js
でdtsm.test.json
が吐く方のbundle.d.ts
を読むようにすればテストが落ちることもなくなる.
$ dtsm init --config dtsm.json
$ dtsm init --config dtsm.test.json
dtsm.test.json
の生成後,少なくともbundle
の変更は忘れずに(dtsm.json
と被ってたら意味なくなる).
dtsm.test.json
に定義ファイルを追加する際は,--config
オプションをdtsm
とinstall
の間に付与する.
$ dstm --config dstm.test.json install angularjs/angular-mocks.d.ts
dtsm
本体のオプション(e.g. --config
)がサブコマンド(e.g. install
)より後ろに来ると動かないので注意.
そもそも…
- もしかして
typings/*.d.ts
をignoreするのが良くなかったりする? - コンパイル前の
*.ts
をCIに投げ渡すのがよくない? - コンパイル後の
*.js
もignoreせずにcommitすべき?
JavaScriptむずかしい.