どうも、らこです。
Angular 2の開発リポジトリでは型定義ファイルの依存解決に関して、最初はtsdだったのが途中でtypingsに移り、そして最近またtsdに回帰していたのですが、ついにtsdすらも使わず、npmだけですべてを解決するようになってました。
いったいどうやって?というのが今回のお話で、結論から言うと @types
スコープから公開されているパッケージがdevDependenciesとして依存されるようになっていました。
@types
typesという名前のユーザーで、明らかにbotだけど中身はMicrosoftの人らしい。(メールアドレスから)
どのパッケージもだいたい 2016/5/17 に最初のpublishがされているらしく、最近始まった取り組みのようです。
現在1700超のパッケージが公開されてますが、すべて型定義ファイルのパッケージです。型定義は https://github.com/DefinitelyTyped/DefinitelyTyped と自動で同期されているらしく、 DefinitelyTypedの1ライブラリが、typesの1パッケージに対応している感じです。
例えばAngularJSの型定義ファイルが欲しければ次のようにインストールします
$ npm install -D @types/angularjs
当然ながら、使うときはnode_modulesの中からd.tsファイルを読み込みます。
すべてのパッケージをチェックしたわけではないですが、基本的には index.d.ts
がエントリポイントになっているようです。
/// <reference path="../node_modules/@types/angularjs/index.d.ts" />
所感
tsdしかり、 dtsmしかり、typingsしかり、DefinitelyTypedから型定義ファイルをダウンロードするツールは、どのライブラリの型定義を得ようとしてもあの巨大なリポジトリを一度pullして、その中から一部を取り出すということが必要で、長いインストール時間にイライラしたことは皆さんあると思います。
typesの型定義パッケージを使うと個別になっているので自分が依存した分だけのダウンロードが行われて、いろいろと幸せそうです。
npmの仕組みに乗れるのでバージョン管理も楽ですし、コンフィグファイルの読み方を覚え直す必要もありません。
この取り組みが本当に公式にしっかりサポートされていくものなのか、ある種の実証実験でまだ乗っからないほうがいいのかわからないのですが、もしMicrosoftやTypeScriptの内部事情に詳しい人がいて知っていたら教えてほしいです。