TernはJavaScriptの構造を解析して、オートコンプリートなどをしてくれるツールです。Phaserの最新版のTern用データを生成する際にエラーが発生して、解決策を知るために定義ファイルの仕様を確認したくなりました。これは、公式ドキュメントのTern Reference Manualを読んだメモです。
Ternは現在、開発が止まってしまっていて、Issuesが積み重なってしまっています。しかし、今のところ他の選択肢が見つかっていないので、できるところまではこれでやろうと考えています。クレジットカードがあれば、AWSのアカウントを取得してCloud9を利用する方がよいかも知れません。
目次
JSON type definitions
概要
Ternは、ソースコードを解析せずに型の特定するためのJSONデータフォーマットを持ちます。
型定義ファイルは、Objectのツリー構造をしています。最上位のオブジェクトがグローバルな変数を定義して、オブジェクトの型を定義するプロパティーをネストさせます。頭に!が付いているプロパティーは特殊な定義(Special directives)で、それ以外のものは通常の変数やプロパティー名の定義です。
例
以下、例です。
{ "!name": "mylibrary", "!define": { "point": { "x": "number", "y": "number" } }, "MyConstructor": { "!type": "fn(arg: string)", "staticFunction": "fn() -> bool", "prototype": { "property": "[number]", "clone": "fn() -> +MyConstructor", "getPoint": "fn(i: number) -> point" } }, "someOtherGlobal": "string" }
この定義にはグローバルな関数と変数が定義されています。MyConstructorはコンストラクター関数を持ち、someOtherGlobalは文字列を持ちます。型や変数、プロパティーのoriginはmylibraryであり、!nameプロパティーで定義されています。
文字列による定義
変数やプロパティーの値は文字列とオブジェクトのいずれで持つこともできます。文字列では以下が利用できます。
number,string,booleanの組み込み型fn(arg1: type1, arg2: type2) -> rettypeという関数型。-> rettypeは省略可能[type]という配列型
文字列では、グローバルスコープにおけるパスでの指定(Date.prototype)や、+を頭に書いたコンストラクターのインスタンス(+Date)を使うこともできます。
オブジェクトによる定義
オブジェクトによる型定義は、プロパティーを列挙して行います。デフォルトでは「単なるObjectのインスタンス」として型定義されますが、!typeプロパティーを使うと、例のMyConstructorのように関数や配列の型を作ることができます。あるいは、!protoプロパティーを使って、カスタムのプロトタイプをオブジェクトに与えることもできます。
例:
"!proto": Element.prototype
ドキュメント
!docを使って、短文ドキュメントをアタッチできます。詳細ドキュメントについては、!urlで文書があるURLを指定するとよいでしょう。
関数の注釈(Annotation)
関数は注釈を表示することができます。defs/ecmascript.jsonから!effectsを探すと例を見ることができます。同様に、関数型の文字列は戻り値を表すことができます。!0は最初の引数型、!Nは(N-1)番目の引数、!thisは呼び出しの自己型、!retは関数の戻り値の型を返します。