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
は関数の戻り値の型を返します。