私は、Kotlinのクラスに静的プロパティを定義する必要があり、Javascriptにコンパイルしたときにそのクラスの静的フィールドがtrueになる状況があります。この状況では、コンパニオンオブジェクトは機能しません。例えばKotlinのクラスに静的プロパティを設定する方法
、私は以下のように抽象クラスとその実装クラスがある場合:これはこれでダウンコンパイルされることを
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
}
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;
}
});
をしかし、私はそれを必要とするものコンパイルするまでは次のようになります。
function MyAbstractClass() {
}
function MyClass() {
MyAbstractClass.call(this);
}
MyClass.id = 1;
したがって、id
フィールドはMyClass
の新しいインスタンスを作成することなく、実際には静的にMyClass
に存在します。
私はコンパニオンオブジェクトを使用しようとしましたが、別のオブジェクト/機能をMyClass$Companion
という名前で作成し、それにid
フィールドを割り当て、実際にはそれを静的にMyClass
に割り当てません。
Kotlinでこのような静的フィールドを設定するにはどうすればよいですか?
inline fun <reified T : Any> addStaticMembersTo(source: Any) {
val c = T::class.js.asDynamic()
val ownNames = js("Object").getOwnPropertyNames(source) as Array<String>
val protoNames = js("Object").getOwnPropertyNames(source.asDynamic().constructor.prototype) as Array<String>
for (name in ownNames + protoNames) {
c[name] = source.asDynamic()[name]
}
}
と使用:あなたがそのような関数を書くことができ、
あなたがJVMにコンパイルした場合は、 '@のJvmStatic'注釈があります。おそらく、JSにはこれに相当するものがありますか? – Mibac
関連する問題:https://youtrack.jetbrains.com/issue/KT-18891 – bashor
クラスに静的変数を宣言できますが、抽象静的変数を宣言することはできません。そのようなことはない。 – Joshua