WebStorm(IntelliJ)のJavaScript静的解析はすごく便利ですね。サポートしているライブラリ/フレームワーク以外にも、TSDでTypeScriptのインターフェースを取り込めたり、自分で書いたコードを読んで推測してくれたり。自分のコードに JSdoc があるとそれがより高精度に。
...でも、それだけではどうしても型ヒントが付かないオブジェクトがあります。外から来たJSONメッセージだったり、MongoDBから読み込んだBSONだったり。存在すると信用していいプロパティなのに、どこにも実装がないがために、ドットでアクセスしたら Unresolved Variable が出ることがあります。
このとき使えるのが JSDoc3 の @typedef
です。
JSONが間違いなくこういう形をしていたとして、
{
"url": "http://qiita.com/",
"rating": 5
}
こうすると警告出たりするんですよね。
var siteRating = incomingData.json; // 外から来た上の形のJSON
tryToUse(siteRating.url); // ここでそんなプロパティないよと警告
警告にはならなくても、優先して補完されるワードに url
と rating
が出ないのは不便。
でもこう書くと...
/**
* @typedef {Object} SiteRating
* @property {string} url
* @property {number} rating
*/
/** @type {SiteRating} */
var siteRating = incomingData.json;
このあとのコードで siteRating.
まで打つと、なんと url
や rating
が補完できます。解析の設定がいくら厳しくても、これでもう警告は出なくなりました。
TypeScriptの文法で別ファイルにインターフェースを定義するまでもなく、ひとつの *.js
の中だけで、実装がないものに手軽に仮想的な型を作ることができてすごく便利。JSDoc3 と WebStorm いいですね。