Динамический тип
Динамический тип не поддерживается в коде, нацеленном на JVM.
Kotlin — язык со статической типизацией, что отличает его от динамически типизированного JavaScript. Для облегчения взаимодействия с кодом JavaScript, Kotlin/JS предлагает тип dynamic:
val dyn: dynamic = ...
Тип dynamic по сути отключает проверку типов Kotlin:
- Значение типа
dynamicможно присвоить переменным любого типа или передать в качестве параметра в любом месте. - Переменной типа
dynamicможет быть присвоено значение любого типа. - Функция, принимающая параметр типа
dynamic, может принимать аргументы любого типа. -
Проверки
nullотключены для значений типаdynamic.
Для переменной типа dynamic вы можете вызвать любое свойство или функцию с любыми параметрами:
dyn.whatever(1, "foo", dyn) // 'whatever' is not defined anywhere dyn.whatever(*arrayOf(1, 2, 3))
Этот код будет скомпилирован «как есть»: dyn.whatever(1) в Kotlin превращается в dyn.whatever(1) в сгенерированном коде JavaScript.
При вызове функций, написанных на Kotlin, для значений типа dynamic имейте в виду переименование имён, выполняемое компилятором Kotlin в JavaScript. Возможно, потребуется использовать аннотацию @JsName или @JsExport для назначения хорошо определённых имён функциям, которые вы хотите вызвать.
Динамический вызов всегда возвращает 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–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/dynamic-type.html