¿Cómo echo un object JavaScript a un object Kotlin?

Recibí un object JavaScript en respuesta a una request HTTP remota. Tengo un model de kotlin (rasgo) que define los diversos campos que espero sobre el object (los nulos son opcionales).

En primer lugar, quiero hacer una comprobación de is para asegurarme de que mi object es, de hecho, del tipo esperado. Inicialmente probé que la payload is MyModel pero eso no funciona debido a la forma en que el operador es escrito en kotlin.js.

En segundo lugar, quiero MyModel a MyModel para que pueda get autocompletado, etc. en el object mientras trabajo con él. Normalmente, el solo es suficiente, pero como eso no funciona, también necesito algo para este problema.

Me gustaría evitar llenar manualmente mi object desde una dynamic . No me importaría hacer esto tanto si pudiera usar by Delegates.mapVal(...) pero eso requiere un Map<String, Any?> Y no sé cómo get mi dynamic / Any? carga útil en un Map<String, Any?> .

1) No tenemos una verificación de estructura por motivos de performance. No estoy seguro de que necesitemos una solución genérica para esto, pero de todos modos creé un problema al respecto , no dude en votar o destacarlo para get actualizaciones.

2) is suficiente si usa smart cast , como:

 if (payload is MyModel) { // call MyModel members on payload } 

Pero no te olvides de (1) 🙂

3) Puedes escribir algo como:

 class MapDynamic<out V>(val d: dynamic) { public fun get(thisRef: Any, desc: PropertyMetadata): V { return d[desc.name] } } class Foo(data: dynamic) { val field: Int by MapDynamic(data) } fun main(args : Array<String>) { val f = Foo(object { val field = 123 }) println(f.field) } 

Pero parece demasiado detallado, pero puede agregar lógica adicional para, por ejemplo, cuando los datos no tienen campo solicitado. Y si no necesitas una lógica personalizada, creo que el elenco es suficiente.

Para la segunda parte, el reparto, puedes hacer:

 fun responseHandler(payload: dynamic) { val myModel = payload as MyModel } 

o

 fun responseHandler(payload: dynamic) { val myModel: MyModel = payload } 

Esto arrojará un NPE si la carga útil es nula, pero en realidad no validará que la carga corresponda a MyModel. En particular, puede terminar con campos / properties nulos que no deberían ser si la carga útil no tuviera esos campos / properties.

  • Inyectar constructor y object complementario
  • ¿Cómo cambiar el resaltado del editor de código 'esta propiedad tiene un campo de respaldo' de Kotlin en IntelliJ?
  • ¿Es bueno que Kotlin permita la extensión de los types existentes?
  • Lamentablemente, el "nombre de la aplicación" se detuvo debido a la biblioteca de Jsoup
  • ¿Por qué mis NewIssues adicionales no se transfieren a sonar? (Complemento Sonar personalizado)
  • Error: Error al convertir bytecode a dex: Causa: com.android.dex.DexException: Múltiples files dex definen Lorg / jetbrains / anko / collections / CollectionsKt;
  • Android Unit Test of Kotlin class falla con "no se puede encontrar la class de símbolo ..."
  • ¿Comportamiento incorrecto de Maybe <List <T >> en Room?
  • Jackson serializador personalizado u object de valor?
  • Kotlin: ¿Cómo puedo get la class de delegación de una propiedad miembro?
  • Error de traducción no detectada: com.android.dx.cf.code.SimException: local 0007: no válido