gpt4 book ai didi

javascript - 如何在 KotlinJs 中生成正文中包含 `this.field=value` 的 javascript 函数

转载 作者:行者123 更新时间:2023-12-03 02:06:43 25 4
gpt4 key购买 nike

当我将 KotlinJS 与 riot 一起使用时,它需要像下面这样的函数来定义标签:

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.nameself.message,类似的,函数体中到处都是大量的动态代码

如何避免它们?我想尽可能编写纯粹的、类型安全的 Kotlin 代码。

并且,是否可以提前定义一个具有更清晰结构的类,例如:

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

我可以接受对类进行一些转换以生成所需的函数。

最佳答案

可能的解决方案可能是将 js("this") 转换为已知的 kotlin 类型。尽管 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!" }
}

关于javascript - 如何在 KotlinJs 中生成正文中包含 `this.field=value` 的 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49773452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com