Динамический тип
Являясь статически типизированным языком, Kotlin всё же должен взаимодействовать с нетипизированными или слабо типизированными средами, такими как экосистема JavaScript. Для таких случаев в языке доступен тип dynamic.
val dyn: dynamic = ...
Тип dynamic по сути отключает проверку типов Kotlin:
Значение типа
dynamicможет быть присвоено любой переменной или передано в качестве параметра.Любое значение может быть присвоено переменной типа
dynamicили передано функции, принимающейdynamicв качестве параметра.Проверки типа
nullотключены для значений типаdynamic.
Самая примечательная особенность типа dynamic заключается в том, что мы можем вызывать любой свойство или функцию с любыми параметрами на переменной типа dynamic.
dyn.whatever(1, "foo", dyn) // 'whatever' is not defined anywhere dyn.whatever(*arrayOf(1, 2, 3))
В среде JavaScript этот код будет скомпилирован «как есть»: dyn.whatever(1) в Kotlin превратится в dyn.whatever(1) в сгенерированном коде JavaScript.
При вызове функций, написанных на Kotlin, на значениях типа dynamic, учтите переименование имен, выполняемое компилятором Kotlin в JavaScript. Возможно, вам потребуется использовать аннотацию @JsName, чтобы назначить хорошо определённые имена нужным функциям для вызова.
Динамический вызов всегда возвращает dynamic в качестве результата, поэтому вы можете свободно использовать такие вызовы в цепочке:
dyn.foo().bar.baz()
Когда вы передаёте лямбда-выражение в динамический вызов, все его параметры по умолчанию имеют тип dynamic:
dyn.foo {
x -> x.bar() // x is dynamic
}
Выражения, использующие значения типа dynamic , переводятся в JavaScript «как есть» и не используют соглашения Kotlin для операторов. Поддерживаются следующие операторы:
бинарные:
+,-,*,/,%,>,<>=,<=,==,!=,===,!==,&&,||-
унарные
префиксные:
-,+,!префиксные и постфиксные:
++,--
присваивания:
+=,-=,*=,/=,%=-
индексированный доступ:
чтение:
d[a], более одного аргумента — ошибказапись:
d[a1] = a2, более одного аргумента в[]— ошибка
Операции in, !in и .. со значениями типа dynamic запрещены.
Для более подробного описания см. документ спецификации.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/dynamic-type.html