Cómo establecer una propiedad estática en una class en Kotlin para Javascript

Tengo una situación en la que necesito definir una propiedad estática en una class en Kotlin y cuando está comstackda en Javascript se convierte en un verdadero campo estático en esa class. En esta situación, los objects complementarios no funcionan.

Por ejemplo, si tengo una class abstracta y su class de implementación como a continuación:

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 } 

El Javascript al que se comstack es el siguiente:

 function MyAbstractClass() { } function MyClass() { MyAbstractClass.call(this); this.id_jz5fma$_0 = 1; } Object.defineProperty(MyClass.prototype, 'id', { get: function () { return this.id_jz5fma$_0; } }); 

Pero lo que necesito para comstackr es esto:

 function MyAbstractClass() { } function MyClass() { MyAbstractClass.call(this); } MyClass.id = 1; 

De modo que el campo de id realmente existe de manera estática en MyClass sin tener que crear una nueva instancia de MyClass .

He intentado utilizar un object complementario, pero eso crea un object / function independiente llamado MyClass$Companion y luego asigna el campo id a eso y nunca lo asigna estáticamente a MyClass .

¿Cómo puedo establecer campos estáticos reales como este en Kotlin?

En este momento no tenemos una forma directa de hacerlo, así que he creado el problema https://youtrack.jetbrains.com/issue/KT-18891

Como solución alternativa, puede escribir una function como esa:

 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] } } 

Y use como:

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

o incluso hacer que los miembros del object complementario estén disponibles como miembro estático de la class:

 class B { companion object { val bar = 1 fun foo() {} // should be at the end of companion object init { addStaticMembersTo<B>(this) } } } 

El ejemplo completo disponible aquí: https://try.kotl.in/#/UserProjects/uube1qikg3vsegtnefo0ad0jag/30f1qf87dt5k5vjhciirt4t108

  • ¿Cómo ejecutar código Kotlin en un plugin IntelliJ?
  • ¿Cómo se especifican los parameters de tipo para el constructor principal en Kotlin?
  • Referencia no resuelta: DaggerTestComponent (Kotlin with Dagger for Test)
  • Genéricos reificados en Scala 2.10
  • Java Wildcard-types vs Kotlin Star-projection
  • ¿Cómo configurar Jacoco con Spek en un proyecto múltiple?
  • Kotlin anula el set de miembros y obtén
  • Anotaciones: cuando es arrayOf necesario
  • UnsupportedOperationException al crear un proyecto de Kotlin en Idea
  • el modificador lateinit no está permitido en las properties de tipo primitivo en Kotlin
  • Repetir acciones en estado con RxJava