メインコンテンツまでスキップ

動的型付け

注記

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

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

val dyn: dynamic = ...

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

  • dynamic型の値は、任意の変数に代入したり、パラメータとしてどこにでも渡したりできます。
  • 任意の値は、dynamic型の変数に代入したり、dynamicをパラメータとして取る関数に渡したりできます。
  • nullチェックはdynamic型の値に対して無効になります。

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

dyn.whatever(1, "foo", dyn) // 'whatever' はどこにも定義されていません
dyn.whatever(*arrayOf(1, 2, 3))

JavaScriptプラットフォームでは、このコードは「そのまま」コンパイルされます。Kotlinのdyn.whatever(1)は、生成されたJavaScriptコードではdyn.whatever(1)になります。

Kotlinで記述された関数をdynamic型の値で呼び出す場合は、KotlinからJavaScriptコンパイラによって実行される名前マングリングに注意してください。呼び出す必要のある関数に明確に定義された名前を割り当てるには、@JsName annotationを使用する必要がある場合があります。

dynamic呼び出しは常にdynamicを結果として返すため、そのような呼び出しを自由にチェーンできます。

dyn.foo().bar.baz()

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

dyn.foo {
x `->` x.bar() // x は dynamic
}

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

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

dynamic型の値を持つin!in、および..演算は禁止されています。

より技術的な説明については、spec documentを参照してください。