Skip to content

動的型

NOTE

JVMをターゲットとするコードでは、動的型はサポートされていません。

静的型付け言語であるKotlinは、JavaScriptエコシステムのような、型なしまたはゆるい型付けの環境と相互運用する必要があります。これらのユースケースを容易にするため、dynamic型が言語で利用可能です。

kotlin
val dyn: dynamic = ...

dynamic型は基本的にKotlinの型チェッカーを無効にします。

  • dynamic型の値は、任意の変数に割り当てたり、どこへでも引数として渡したりできます。
  • 任意の値をdynamic型の変数に割り当てたり、dynamicを引数に取る関数に渡したりできます。
  • dynamic型の値に対するnullチェックは無効になります。

dynamicの最も特徴的な機能は、任意のプロパティや関数を任意の引数でdynamic変数に対して呼び出すことができる点です。

kotlin
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へのコンパイラによって実行される名前マングリングに留意してください。呼び出す必要のある関数に明確な名前を割り当てるには、@JsNameアノテーションを使用する必要があるかもしれません。

動的な呼び出しは常にdynamicを結果として返します。そのため、そのような呼び出しを自由に連鎖させることができます。

kotlin
dyn.foo().bar.baz()

動的な呼び出しにラムダを渡すと、そのすべてのパラメータはデフォルトでdynamic型になります。

kotlin
dyn.foo {
    x -> x.bar() // xはdynamicです
}

dynamic型の値を使用する式は、JavaScriptに「そのまま」変換され、Kotlinの演算子規則は使用しません。 次の演算子がサポートされています。

  • 二項: +, -, *, /, %, >, <, >=, <=, ==, !=, ===, !==, &&, ||
  • 単項
    • 前置: -, +, !
    • 前置および後置: ++, --
  • 代入: +=, -=, *=, /=, %=
  • インデックス付きアクセス:
    • 読み込み: d[a], 複数の引数はエラーになります
    • 書き込み: d[a1] = a2, []内の複数の引数はエラーになります

dynamic型の値に対するin!in、および..演算は禁止されています。

より技術的な説明については、仕様ドキュメントを参照してください。