Spec-Zone.ru › Kotlin 1.9

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

Динамический тип не поддерживается в коде, нацеленном на JVM.

Являясь статически типизированным языком, 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 запрещены.

Для более подробного описания см. документ спецификации.

Последнее изменение: 11 февраля 2021
Использование кода JavaScript из Kotlin Использование зависимостей из npm

© 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

Spec-Zone.ru

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