Spec-Zone.ru › Kotlin 1.4

Динамический тип

Динамический тип не поддерживается в коде, нацеленном на 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API