この記事は SkyWay Advent Calendar 2018の13日目の記事です。
経緯
研究室で作っているシステムで WebRTC/SkyWay を活用させて頂いたのですが、気が向いてすべて TypeScript にしてしまいました。
開発開始当初は、その当時の DefinitelyTyped にあがっていた Toshiya Nakakuraさんの型定義を使っていたのですが、あちこち細かい部分がメンテされていなかったので、トランスパイル時に結構エラーがはかれていました。SkyWay JS SDKに対する単純な型定義不足に加えて、 TypeScript 3.0 前後から WebRTC とその周辺に関する DOM の定義が徐々に TypeScript の標準に組み込まれて、 /// <reference types="webrtc" />
としている部分が多重定義になっているものもあったりしたのが原因です。
そこで、思い切って自分で型定義ファイルをつくってみて、Pull Request を出して、無事(*)マージしてもらえました
コード
リポジトリはこちらです
DefinitelyTyped/types/skyway at master · DefinitelyTyped/DefinitelyTyped · GitHub
これまでも何度か型定義ファイルをコミットしてきた(余談)のですが、勉強不足でよくわかってないことも多い気がします。が、以下の方針で書いてみました。
html 中で CDNから最新の skyway-latest.js をロードして利用する。
モジュール周りは最新の仕様に私がついて行けてなかったり、さまざまなパタンに対応しなければならないので考えないことにしました。ある意味最も「べた」な手法として皆が納得して(諦めて)くれるだろう手法にとりあえず対応しておく、という考え方です。異論は大いに認めますので、どなたか改善策を教えて下さい。。。
@types/webrtc
を捨てる = TypeScript 3.0 利用とする
以前の型定義には /// <reference types="webrtc" />
と言う記述がありました。これは、かつての typescript には、 RTCほげほげ
のような WebRTC 関連の型定義がほとんど無かったため、それを補うための型定義群を読み込む物でした。(参照→ DefinitelyTyped/types/webrtc at master · DefinitelyTyped/DefinitelyTyped · GitHub)これらは今(ちゃんと確かめてないけどたぶん TypeScript 3.0 あたり)では ts 公式の lib.dom.d.tsにきれいに定義されていて不要になりました。
もちろん、 SkyWay のドキュメントを読むと、あちこちに RTCほげほげ
が出てきます。これが、 TypeScript の lib.dom.d.ts
の記述と矛盾が無い様に書いていきます。
不安点
自分の不勉強が原因ですが、今回 namespace 等を利用していません。型定義を書いたのがちょっと前のことなので詳細な理由を失念してしまったのですが、はじめそうしようと思っていたのに上手く出来なくてやめました。
これのせいで、万が一他のライブラリとクラス名等かぶってしまうと大問題です。これについては どなたか助けてください(懇願)
手続
ここからは、本家にマージされるまでの手続について書いていきます。
制作
- ドキュメントとコードをみながら、自分の手元で
skyway/index.d.ts
を書く - 自分のプロジェクトで使い続けて、問題が無いことを日々確認し続ける (トテモダイジ)
- DefinitelyTyped が最新になるよう pull してきて、上記
skyway/index.d.ts
を突っ込む。 - 自分の変更内容を既存の
test.ts
にも反映させる。 - 僭越ながら、
skyway/index.d.ts
のヘッダ部に、自分に関する記名をさせて頂く
テスト
- DefinitelyTyped プロジェクト内で
npm i
して、テスト等に必要なパッケージを取得 npm test
(このコマンドを叩きなさい、というのは DefinitelyTyped リポジトリの READMEには書いて無くて、後で出てくる PR のコメントにはしろ、と書いてある)index.d.ts
のヘッダーに余計な記述があったので削除- ヘッダも実は専用のコードで厳密にチェックされている。詳細はこちら→ GitHub - Microsoft/definitelytyped-header-parser: A utility for parsing DefinitelyTyped headers out of TypeScript .d.ts files.
tsconfig.json
に必要なreferenceは書かれているので、test.ts
内に/// <reference types="skyway" />
は書かなくて良い、というエラーに対応。
- あらためて
npm test
npm run lint skyway
して、テストコードをチェック。(これは、DefinitelyTyped の README中に説明がある)ERROR: 31:44 no-angle-bracket-type-assertion Type assertion using the '<>' syntax is forbidden. Use the 'as' syntax instead.
と言うのが出るので修正。
Pull Request
- コードを自分のリモートにプッシュ。
- Pull Request してみる
- コメント欄がテンプレートで自動生成されるので,チェックボックスを埋めたりしてPR→参照
- Travis CI が走ったりして問題ことを確認(基本は、上でやったテストと同じことをしている模様)
- メンテナーのチェック待ち状態になる
Merged
- typescript-botくんが @nakakura さんに review 依頼をする
- 1週間音沙汰が無いので、 maintainer におはちが回ってくる。
- そこから二日でマージされる
という感じ。自分でもずっと使っているコードなので嬉しかったです。
最後に
冒頭に紹介したものと、もう一つ別のプロジェクトでもこの型定義ファイルは使っているので、そこそこ大丈夫だとは思うのですが、特に名前衝突問題とか、改善点があったら是非 DefinitelyTyped に突っ込んでみてください。あるいは私に直接指摘して下さっても結構です。みなさんにとってより使いやすい物となりますように!
余談
TypeScript に関して過去に書いた記事のご紹介