Scala.jsでJavaScriptのマッピングコードを簡単に作成する

Scala.jsからJavaScriptライブラリを使うには以下のようなマッピング用のコードが必要になります。

trait Window extends js.Object {
  val document: HTMLDocument = js.native
  var location: String = js.native

  def innerWidth: Int = js.native
  def innerHeight: Int = js.native

  def alert(message: String): Unit = js.native

  def open(url: String, target: String,
      features: String = ""): Window = js.native
  def close(): Unit = js.native
}

Scala.jsのサイトにはすでにマッピングが存在するライブラリやフレームワーク一覧が記載されていますが、jQueryやAngularJSなど著名なものが中心で、本格的なアプリケーションを開発するのであればこれだけではカバー仕切れないケースがほとんどだと思います(ユーザ層の偏りか、特にアニメーション系のライブラリは皆無)。その場合はマッピングファイルを自分で作成しなくてはなりません。ただ、大規模なライブラリの場合はこの作業がかなりつらい感じになります。

こんな場合に使えるのがscala-js-ts-importerです。

これはTypeScriptの.d.tsファイルからScala.js用のマッピングコードを自動生成するというもので、以下のようにGitHubからリポジトリをcloneして直接sbtで実行して使います(sbtは別途インストールしておく必要があります)。TypeScriptの.d.tsファイルはDefinitelyTypedというGitHubリポジトリに様々なライブラリのものが集められていますので、ここから必要なものを探して使うといいでしょう。

$ git clone https://github.com/sjrd/scala-js-ts-importer.git
$ cd scala-js-ts-importer
$ sbt 'run somelib.d.ts SomeLib.scala'

ただし、このscala-js-ts-importer、A | Bという型をパースできなかったり、生成したScalaコードもそのままではコンパイルが通らない場合が多く、手で修正する必要があります。とはいえ、ゼロからマッピングを作成するのに比べればかなり手間を省けると思いますのでScala.jsを使う場合は活用するといいと思います。