如何将JavaScript对象投射到Kotlin对象?

我收到一个JavaScript对象来响应远程HTTP请求。 我有一个kotlin模型(trait),它定义了我期望的对象的各个字段(可为空的字段是可选的)。

首先,我想做一个检查,以确保我的对象实际上是预期的类型。 我最初尝试的payload is MyModel但是由于is运算符写在kotlin.js中的方式不起作用。

其次,我想投射到MyModel这样我就可以在对象上自动完成等等。 通常情况下,只有这样就足够了,但是既然不行,我也需要这个问题。

我想避免手动从dynamic填充我的对象。 我不介意这么做,如果我可以使用by Delegates.mapVal(...)但需要一个Map<String, Any?> ,我不知道如何让我的dynamic / Any? 有效载荷到Map<String, Any?>

1)由于性能原因,我们没有进行结构检查。 我不确定我们是否需要通用解决方案,但无论如何,我都会为此创建问题 ,随意投票或为其获取更新。

2) is足够了,如果你使用聪明的演员 ,就像:

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

但是不要忘记(1):)

3)你可以写下如下的东西:

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

但它看起来太冗长了,但是你可以添加额外的逻辑,例如当数据没有请求字段时。 如果你不需要自定义逻辑,我认为演员就足够了。

对于第二部分,演员,你可以这样做:

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

要么

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

如果有效载荷为空,这将会抛出一个NPE,但是实际上不会验证有效载荷是否与MyModel匹配。 特别是,如果有效载荷遗漏了这些字段/属性,那么最终可能会得到空字段/属性。