LoginSignup
6
6

More than 5 years have passed since last update.

Haxe 3.2.0で型付きのrequireをする

Posted at

これまでHaxeからCommonJS requireを実現するには、haxelibからnodejsライブラリをインストールする必要があった。しかし、nodejsライブラリに定義されているrequireは戻り値の型がDynamicと定義されていたので、存在しないメソッド呼び出しをしてもコンパイル時にエラーが発生しなかった。

import js.Node;

class Main {
    static public function main() {
        var fileSystem = Node.require('fs');
        fileSystem.thisMethodMustNotExist();
    }
}

このことにより型があるというHaxeの強みが失われていたが、3.2.0以降のバージョンでは@:jsRequireアノテーションによりrequireしたモジュールに型を定義できるようになる。

3.2.0はまだリリースされていないのでリポジトリから取得する。OSX, Homebrewで--HEADオプションつけてインストールしている。

$ brew install haxe --HEAD

@:jsRequireexternシンタックスと併用する。試しにインターフェースが簡単なfs.existsSyncのみを実装してコンパイルしてみる。

@:jsRequire('fs')
extern class FS {
    static function existsSync(path:String):Bool;
}

class Main {
    static public function main() {
        trace(FS.existsSync('/etc/hosts'));
    }
}

コンパイルしたら@:jsRequire('fs')アノテーションがrequire('fs')に変換されていることが確認できる。コンパイル成功を確認したら次にわざとメソッド呼び出しをtypoして、コンパイルエラーが発生することを確認しよう。

EventEmitterのようにrequire('events').EventEmitterの形で使いたい場合は、@:jsRequire('events', 'EventEmitter')とアノテーションに第2引数を設定する。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6