2017-07-06 38 views
0

私は、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] 
    } 
} 

と使用:あなたがそのような関数を書くことができ、

+0

あなたがJVMにコンパイルした場合は、 '@のJvmStatic'注釈があります。おそらく、JSにはこれに相当するものがありますか? – Mibac

+1

関連する問題:https://youtrack.jetbrains.com/issue/KT-18891 – bashor

+0

クラスに静的変数を宣言できますが、抽象静的変数を宣言することはできません。そのようなことはない。 – Joshua

答えて

0

は、今、私たちはそれを行うための直接的な方法を持っていないので、私は回避策として問題https://youtrack.jetbrains.com/issue/KT-18891

を作成しました以下のような:

class A { 
    companion object { 
     init { 
      addStaticMembersTo<A>(object { 
       val bar = 1 
       fun foo() {}     
      }) 
     } 
    } 
} 

あるいはクラスの静的メンバとしてコンパニオンオブジェクトのメンバーが利用できるようにする:

class B { 
    companion object { 
     val bar = 1 
     fun foo() {}     

     // should be at the end of companion object 
     init { 
      addStaticMembersTo<B>(this) 
     } 
    } 
} 

ここで入手可能フル例: https://try.kotl.in/#/UserProjects/uube1qikg3vsegtnefo0ad0jag/30f1qf87dt5k5vjhciirt4t108

関連する問題