17.
jQueryのajax関数
(kotlin-js-libraryでは未定義)を使う
import jquery.jq
public fun main(args: Array<String>) {
jq {
jq(“.button”).click(e -> {
val options = ajaxOptions(
“greeting”, “GET”,
Person(“foo”,”bar”))
ajax<Message,Any>(options)
.done { msg, raw, jqXHR ->
jq(“name”).text(msg.text)
jq(“message”).text(msg.message)
}
})
}
}
Interoperating with existing JS libs
18.
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
19.
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
nativeアノテーションで
JavaScriptにコンパイルし
た時の出力される名前を指定
20.
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
実装はいらないのでnoImpl
を指定する
21.
自分で既存JSライブラリーの
インターフェースを定義する
native(“$.ajax”)
public fun ajax<R,E>(
options: jqAjaxOption):
jqPromise<R,E> = noImpl
native(“jqXHR”)
open class jqPromise<R,E>() {
fun done(handler:
(R,String,jqDeferred<R,E>)->Unit):
jqDeferred<R,E> = noImpl
fun fail(handler:
(jqDeferred<R,E>,String,E)->Unit):
jqDeferred<R,E> = noImpl
}
Interoperating with existing JS libs
ハンドラーの引数は型安全に
したいのでジェネリクスを付
ける
22.
Interoperating with
existing JS libraries
• JavaScriptのシンプルなオブジェクトが欲しい場
合
• 普通のclassを用いれば後はよしなにやってくれる
class Person(
val firstName: String,
val lastName: String)
// Person(“foo”, “bar”)
// -> {firstName:”foo”, lastName: “bar”}
23.
Interoperating with
existing JS libraries
• 落とし穴
• deep copyをするなどのJavaScriptの実装によっては実
行時エラーが発生する
class jqAjaxOption<T>(
val url: String,
val method: String,
val data: T)
// jQueryがdataパラメーターを処理しているときに
// cannot set property ‘firstName’ of undefined
// のようなエラーが発生する
24.
Interoperating with
existing JS libraries
• 解決策
• json(Pair<String,Any>…): Json を使う
interface JsonSerializable {
fun asJson(): Json
}
class Person(
val firstName: String, val lastName: String):
JsonSerializable {
override fun asJson(): Json {
return json(Pair(“firstName”,firstName),
Pair(“lastName”, lastName))
}
}
25.
Kotlin as an AltJS
• まだAltJSとして使うにはつらいところが多々ある
• Kotlinから生成されるJavaScriptの品質につい
てはJetBrainsに頑張ってもらう一方で、ユー
ザーである我々もフィードバックしていくことが望
まれる
• Kotlinが使ってもらえるAltJSとなるには、エコ
システムの構築にカギがある
26.
Kotlin as an AltJS
• TypeScript
• DefinitelyTypedプロジェクトによるエコシ
ステム
• tsdやdtsmのような簡易に型情報を収集する
ツール
27.
Kotlin as an AltJS
• Scala.js
• scala-js.orgでライブラリーへのリンクが貼ってあ
る
• 基本的なスタンスは「sbtで取ってきてね」という感じ
• 最初はギャグと言われていたけど、Scalaのユーザー
数が増えているのでScala.jsのエコシステムも充実し
つつあるという印象
28.
Kotlin as an AltJS
• AltJSとしてKotlinを使ってもらうためには…
• エコシステムの構築
• レポジトリーの構築
• 必要なライブラリーを管理するツールの構築
• そもそものユーザー数を増やしていく
• ちなみにKotlin自体は3時間さわった感じでは、よい言語に分類でき
ると思ってます
Be the first to comment