dynamic型
dynamic型は、JVMをターゲットとするコードではサポートされていません。
Kotlinは静的型付け言語ですが、JavaScriptのエコシステムのような、型のない、あるいは型付けの緩い環境と相互運用する必要があります。これらのユースケースを容易にするために、言語内で dynamic 型が利用可能です。
val dyn: dynamic = ...dynamic 型は基本的にKotlinの型チェッカーをオフにします。
dynamic型の値は、任意の変数に代入したり、パラメーターとしてどこにでも渡したりすることができます。- 任意の値を
dynamic型の変数に代入したり、dynamicをパラメーターとして受け取る関数に渡したりすることができます。 dynamic型の値に対しては、nullチェックが無効になります。
dynamic の最も特徴的な機能は、dynamic 変数に対して、任意のパラメーターであらゆるプロパティや関数を呼び出すことができる点です。
dyn.whatever(1, "foo", dyn) // 'whatever' はどこにも定義されていません
dyn.whatever(*arrayOf(1, 2, 3))JavaScriptプラットフォームでは、このコードは「そのまま」コンパイルされます。Kotlinの dyn.whatever(1) は、生成されたJavaScriptコード内でも dyn.whatever(1) になります。
dynamic 型の値に対してKotlinで記述された関数を呼び出す場合は、KotlinからJavaScriptへのコンパイラによって行われる名前マングリング(name mangling)に注意してください。呼び出す必要がある関数に対して、明確に定義された名前を割り当てるために、@JsNameアノテーションを使用する必要があるかもしれません。
動的な呼び出しは常に結果として dynamic を返すため、そのような呼び出しを自由に連鎖させることができます。
dyn.foo().bar.baz()動的な呼び出しにラムダを渡す場合、そのすべてのパラメーターはデフォルトで dynamic 型になります。
dyn.foo {
x -> x.bar() // x は dynamic です
}dynamic 型の値を使用した式は、JavaScriptへ「そのまま」変換され、Kotlinの演算子の慣習(operator conventions)は使用されません。以下の演算子がサポートされています。
- 2項演算子(binary):
+,-,*,/,%,>,<>=,<=,==,!=,===,!==,&&,|| - 単項演算子(unary)
- 前置:
-,+,! - 前置および後置:
++,--
- 前置:
- 代入演算子(assignments):
+=,-=,*=,/=,%= - 添字アクセス(indexed access):
- 読み取り:
d[a]、2つ以上の引数はエラー - 書き込み:
d[a1] = a2、[]内に2つ以上の引数がある場合はエラー
- 読み取り:
dynamic 型の値を使用した in、!in、および .. 操作は禁止されています。
より技術的な説明については、仕様書(spec document)を参照してください。
