如何在 Kotlin for Javascript 中为类设置静态属性

Gra*_*ham 4 javascript kotlin kotlin-js-interop

我遇到一种情况,我需要在 Kotlin 中的类上定义静态属性,当它编译为 Javascript 时,它会成为该类上真正的静态字段。在这种情况下,伴随对象不起作用。

例如,如果我有一个抽象类及其实现类,如下所示:

abstract class MyAbstractClass{
  abstract val id: Int
}

class MyClass: MyAbstractClass(){
  override val id: Int = 1 //I want this to actually be "static" on the MyClass
}
Run Code Online (Sandbox Code Playgroud)

编译后的 Javascript 是这样的:

function MyAbstractClass() {
}

function MyClass() {
  MyAbstractClass.call(this);
  this.id_jz5fma$_0 = 1;
}

Object.defineProperty(MyClass.prototype, 'id', {
  get: function () {
    return this.id_jz5fma$_0;
  }
});
Run Code Online (Sandbox Code Playgroud)

但我需要它编译成这样:

function MyAbstractClass() {
}

function MyClass() {
  MyAbstractClass.call(this);
}

MyClass.id = 1;
Run Code Online (Sandbox Code Playgroud)

这样该id字段实际上静态存在于 上,MyClass而无需创建 的新实例MyClass

我尝试过使用伴随对象,但它创建了一个单独的对象/函数MyClass$Companion,然后将id字段分配给它,但实际上从未将其静态分配给MyClass.

我怎样才能在 Kotlin 中设置这样的真正的静态字段?

bas*_*hor 5

现在我们没有\xe2\x80\x99t有直接的方法来做到这一点,所以我\xe2\x80\x99创建了问题https://youtrack.jetbrains.com/issue/KT-18891

\n\n

作为解决方法,您可以编写如下函数:

\n\n
inline fun <reified T : Any> addStaticMembersTo(source: Any) {\n    val c = T::class.js.asDynamic()\n    val ownNames = js("Object").getOwnPropertyNames(source) as Array<String>\n    val protoNames = js("Object").getOwnPropertyNames(source.asDynamic().constructor.prototype) as Array<String>\n\n    for (name in ownNames + protoNames) {\n        c[name] = source.asDynamic()[name]\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并使用如下:

\n\n
class A {\n    companion object {\n        init {\n            addStaticMembersTo<A>(object {\n                val bar = 1\n                fun foo() {}                \n            })\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

甚至使伴生对象的成员可用作类的静态成员:

\n\n
class B {\n    companion object {\n        val bar = 1\n        fun foo() {}                \n\n        // should be at the end of companion object\n        init {\n            addStaticMembersTo<B>(this)\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

完整示例可在此处获取:\n https://try.kotl.in/#/UserProjects/uube1qikg3vsegtnefo0ad0jag/30f1qf87dt5k5vjhciirt4t108

\n