HAXEとTYPESCRIPTで同じコンテ
ンツを作って比較してみた。
UXM事業部UXD-Unit マークアップエンジニア
西田慎吾
特徴
Haxeの特徴
 http://haxe.org/
 2005年~(現時点での最新バージョンは3.0)
 静的型付けのオブジェクト指向言語
 ActionScript3.0に非常に類似
 JavaScriptだけでなく、
Flash/AIR/C++/PHP/Java/C#/Neko他に変換
TypeScriptの特徴
 http://www.typescriptlang.org/
 2012年~(現時点での最新バージョンは0.9)
 MicroSoftが開発するオープンソース言語
 JavaScriptに型やクラス、名前空間を追加
 JavaScript との親和性が高く、可読性の高いJavaScriptが出力さ
れる
なぜ注目したのか?
学習コスト
 Haxe
 ActionScript3.0に酷似
 Flasherにとっては非常に親しみやすい言語
 慣れ親しんだFlashDevelopでの開発が出来る
 TypeScript
 基本的な文法は既存のJavaScriptと同じ
 JavaScriptに型やクラス、名前空間を拡張した言語
 JavaScriptの学習の延長で習得可能
将来性
 Haxe
 2005年~という非常に古い歴史を持っていて順調にバージョン
アップを重ねているという信頼感がある
 ActionScript3.0に酷似していて、フロントエンドエンジニア(特に
Flasher)が移行しやすい環境がある
 TypeScript
 MicroSoftが開発、設計
 既存のJavaScriptとの親和性が非常に良く、導入にあたりデメリッ
トが尐ない
※実案件への採用はvar1.0登場まで待ちたい
コードの比較
注目する3つのポイント
 パッケージ管理(入れ子、コードの分割)
 クラスの利用(パブリック、プライベート、継承、インターフェイス)
 JavaScriptのライブラリと既存資産の利用
これらに支障が出なければ、大小に限らず実案件での
使用が現実的になってくるのではないか
Haxeでのパケージ管理
 パッケージと同様の入れ子構造をもったディレクト
リを作り、1hxファイルで1クラスを定義
→コードを分割することで、コードの生産性と保守性が保たれ
る
 コンパイル時にimportしたファイルを判別して自動
的に結合、出力
→無駄のないJavaScriptコードが出力できる
Haxeでのクラスの特徴
 はじめに実行されるコードはMain.hxのMainクラス(設定ファ
イルにて変更可能)の静的関数main()
※静的関数が初期実行のトリガーとなるので、Mainクラス内では必然的に静的メンバを使用
 コンストラクタ関数としてnew()が用意
 JavaScriptとは違い「this」は必ずインスタンスを指す
 修飾子にはpublic private static dynamic overrideが用意
※省略すると「private」
 forループは必ず「for( i in 0...a.length ) {}」を使用
 extendsキーワードで継承、implementsでインターフェースを定
義
 親クラスと同じ数と型の引数を持ったメソッドをoverrideっ
キーワードでオーバーライドして再定義
 親クラスのメソッドへのアクセスにはsuperを使用
HaxeでのJSライブラリと既存資産の利用
 jQueryの利用
 コンパイルを通すためjQueryExternという、jQueryラッパー
ライブラリを利用
※jQuery型指定のみが記述されたライブラリだが自作は厳しい
※Dynamicという動的型付けを行えばコンパイルを通すことが出来る
 既存JavaScriptコードの利用
 DOMのAPIを叩きたい時には、HaxeAPIを介して叩く必要が
あり、JavaScriptコードの移植に関しては注意が必要
TypeScriptでのパケージ管理
 モジュールとして名前空間を定義
 モジュールを入れ子にすることによって、パッケージのような
ものを作成
 importしたクラスを自動的に結合して一つのJavaScriptファイル
を作成してくれるといったことはなく、分割したファイルは
HTMLで読み込む必要がある
※コンパイル時のオプションで、複数のTSファイルを指定して、結合したJavaScriptを作
成することは可能
 同一ファイル内に複数のモジュールとクラスを記述したとして
も、そのクラスを利用する際には、予め定義(使用する行より上部に
記述)していないとエラーとなる
TypeScriptでのクラスの特徴
 自前でMainクラスからインスタンスを作成して、コンストラクタ関数
を叩く必要がある
 コンストラクタ関数としてconstructor()を用意
 メンバ変数は「var」キーワードは付けずに、メンバ関数は
「function」のキーワードは付けずに記述
 修飾子にはpublic private staticが用意
※省略すると「public」
 「this」はそれが書かれている場所によって意味が異なる
 extendsキーワードで継承、implementsキーワードでインター
フェースを定義
 親クラスのメソッドを同一名称でオーバーライドして再定義
※特に修飾子による記述はないために、知らない間に重要なメソッドを上書いてしまいかねません。
※「private」なクラスメンバのオーバーライドはコンパイルエラーとなってしまいますので、親クラスの
メンバに関しては基本「public」属性とならざるを得ません。
 親クラスのメソッドへのアクセスにはsuperを使用
TypeScriptでのJSライブラリと既存資産の利用
 jQueryの利用
 コンパイルを通すためにjQuery型定義ファイルをダウンロー
ドして作業フォルダに入れ、「/// 」と定義ファイルのパス
を記述
※独自に型定義ファイルを作るのは非常に容易
 既存JavaScriptコードの利用
 直接JavaScriptを記述することが可能で、既存JavaScriptコー
ドの移植に関してそのまま利用できる
まとめ
Haxe TypeScript
パッケージ管理
 コードが分割できクラス単位での管理がし
やすく、コンパイル時にimportしたファイ
ルを判別して自動的に結合、出力するので、
無駄のないJavaScriptコードが出力できる
クラスの利用
 ActionScript3.0とほぼ同様の機能を有して
いる
JavaScriptのライブラリと既存資産の利用
 ライブラリ使用に関してはラッパーライブ
ラリが存在していれば問題ないが、無かっ
た場合は動的型付けで対応
 JavaScriptを記述したい場合にDOMのAPIを
直接叩く事が出来ないために、HaxeのAPI
に依存
パッケージ管理
 モジュールとして名前空間を定義すること
ができるがファイルが分割しづらく、また
クラスを利用する際には、予め定義(使用
する行より上部に記述)していないといけ
ないといった事を考えると、とてもパッ
ケージ管理とは言い難い状況
クラスの利用
 クラス内部での「this」の扱いやオーバー
ライドに関しては不満があるが、工夫次第
で解決出来る問題の範囲
JavaScriptのライブラリと既存資産の利用
 直接JavaScriptを記述することが可能で、既
存JavaScriptコードをそのまま移植、利用す
ることができる
結論
 Haxeはクラスベースのオブジェクト指向言語という
点文句の言いようもないものだが、JavaScriptライブ
ラリを利用したり、以前のJavaScriptコードを利用す
る分には慎重にならざるを得ない
 TypeScriptはあくまでJavaScriptを拡張したイメージ
なので、その点ではいまいちな点が多いが、
JavaScriptとの親和性を考えると、現時点では現実的
な選択肢
※ver1.0を待ちたい

Haxeとtype scriptの比較