Как сгенерировать функцию javascript с `this.field = value` в теле в kotlinjs

Когда я использую KotlinJS с бунт, для определения тега требуется следующая функция:

function (opts) {
    var self = this
    self.name = "sample"
    self.message = "init-message"

    self.onCreate = fun(opts: dynamic) {
        self.message = opts.message
    }

    self.click = fun() {
        self.message = "Clicked!"
    }
}

Хотя я могу написать код Kotlin вот так:

fun(opts: dynamic) {
    val self = js("this")

    self.name = "sample"
    self.message = "init-message"

    self.onCreate = fun(opts: dynamic) {
        self.message = opts.message
    }

    self.click = fun() {
        self.message = "Clicked!"
    }
}

Но вы можете видеть, что у него есть несколько проблем:

  1. Мы должны использовать некоторые трюки js("this")
  2. self.name, self.message и т.п., в теле функции много динамического кода.

Как их избежать? Я хочу писать как можно больше чистого, безопасного по типу кода Kotlin.

И, заранее, можно ли определить класс с более четкой структурой, например:

class MyTag {
   val name = "sample"
   var message = "init-message"
   fun onCreate() {}
   fun click() {}
}

Я могу согласиться выполнить некоторые преобразования класса, чтобы сгенерировать требуемую функцию.

0
0
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможным решением может быть приведение js("this") к известному типу котлина. Хотя js() все еще существует, его использование очень локально, а код действительно типобезопасен.

Приведенный ниже код создает то, что вам нужно, в js.

interface MyTag {
    var name: String

    var message: String

    var onCreate: (dynamic) -> Unit

    var click: () -> Unit
}

inline fun <T> builder(block: T.() -> Unit) = block(js("this"))

fun tagFunction(opts: dynamic) = builder<MyTag> {
    name = "sample"

    message = "init-message"

    onCreate = { message = opts.message }

    click = { message = "Clicked!" }
}

Хочу сказать "Спасибо!" тысячи раз! Ты решил мне большую проблему

Freewind 12.04.2018 17:03

Другие вопросы по теме