gpt4 book ai didi

kotlin - 如何在 Kotlin 中为属性的支持字段设置 JsName?

转载 作者:IT老高 更新时间:2023-10-28 13:46:00 25 4
gpt4 key购买 nike

我在 1.0.x 中使用了 Kotlin 不受支持的 JavaScript 后端,现在正在尝试将我的玩具项目迁移到 1.1.x。它是与 PouchDB 交互的单页 Web 应用程序的最基本部分。要将数据添加到 PouchDB,您需要具有特定属性 _id_rev 的 JavaScript 对象。它们还需要有任何其他以 _ 开头的属性,因为它们是由 PouchDB 保留的。

现在,如果我创建一个这样的类,我可以将实例发送到 PouchDB。

class PouchDoc(
var _id: String
) {
var _rev: String? = null
}

但是,如果我做任何事情来使属性虚拟化——让它们覆盖一个接口(interface),或者让类打开并创建一个覆盖它们的子类——_id 字段名称变成_id_mmz446$_0 之类的东西,所以 PouchDB 拒绝该对象。如果我将 @JsName("_id") 应用于该属性,那只会影响生成的 getter 和 setter —— 它仍然会留下带有错误名称的支持字段。

此外,对于名称不以 _ 开头的任何虚拟属性,PouchDB 将接受该对象,但它仅存储带有错误名称的支持字段,而不是命名良好的属性。

我认为,现在我可以通过使它们不是虚拟的来解决问题。但是我在考虑在 Kotlin 中共享 PouchDoc 和非 PouchDoc 类之间的接口(interface),但我似乎无法做到。

知道我怎样才能做到这一点,还是需要改变 Kotlin 语言?

最佳答案

我认为https://youtrack.jetbrains.com/issue/KT-8127 应该涵盖您的问题。

此外,我还创建了一些其他相关问题: https://youtrack.jetbrains.com/issue/KT-17682 https://youtrack.jetbrains.com/issue/KT-17683

现在您可以使用下一个解决方案之一,IMO 第三个是最轻量级的。

interface PouchDoc1 {
var id: String
var _id: String
get() = id
set(v) { id = v}

var rev: String?
var _rev: String?
get() = rev
set(v) { rev = v}
}

class Impl1 : PouchDoc1 {
override var id = "id0"
override var rev: String? = "rev0"
}

interface PouchDoc2 {
var id: String
get() = this.asDynamic()["_id"]
set(v) { this.asDynamic()["_id"] = v}

var rev: String?
get() = this.asDynamic()["_rev"]
set(v) { this.asDynamic()["_rev"] = v}
}

class Impl2 : PouchDoc2 {
init {
id = "id1"
rev = "rev1"
}
}

external interface PouchDoc3 { // marker interface
}

var PouchDoc3.id: String
get() = this.asDynamic()["_id"]
set(v) { this.asDynamic()["_id"] = v}

var PouchDoc3.rev: String?
get() = this.asDynamic()["_rev"]
set(v) { this.asDynamic()["_rev"] = v}

class Impl3 : PouchDoc3 {
init {
id = "id1"
rev = "rev1"
}
}

fun keys(a: Any) = js("Object").getOwnPropertyNames(a)

fun printKeys(a: Any) {
println(a::class.simpleName)
println(" instance keys: " + keys(a).toString())
println("__proto__ keys: " + keys(a.asDynamic().__proto__).toString())
println()
}

fun main(args: Array<String>) {
printKeys(Impl1())
printKeys(Impl2())
printKeys(Impl3())
}

关于kotlin - 如何在 Kotlin 中为属性的支持字段设置 JsName?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43696152/

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