2015-02-16 3 views
0

Я получил объект JavaScript в ответ на удаленный HTTP-запрос. У меня есть модель kotlin (trait), которая определяет различные поля, которые я ожидаю от объекта (нулевые могут быть необязательными).Как создать объект JavaScript для объекта Kotlin?

Прежде всего, я хочу сделать проверку is, чтобы убедиться, что мой объект на самом деле ожидаемого типа. Я изначально пробовал payload is MyModel, но это не работает из-за того, как оператор is написан в kotlin.js.

Во-вторых, я хочу отдать MyModel, поэтому я могу получить автозаполнение и т. Д. На объекте, пока я работаю с ним. Обычно одного is будет достаточно, но поскольку это не работает, мне тоже нужно что-то для этой проблемы.

Я хотел бы избежать ручного заполнения моего объекта с помощью dynamic. Я бы не прочь сделать это так много, если бы мог использовать by Delegates.mapVal(...), но для этого требуется Map<String, Any?>, и я не знаю, как получить полезную нагрузку в Map<String, Any?>.

ответ

3

1) У нас нет проверки конструкции для is по соображениям безопасности. Я не уверен, что для этого нам нужно общее решение, но в любом случае я создал issue about it, не стесняйтесь проголосовать или запустите его, чтобы получать обновления.

2) is достаточно, если вы используете smart cast, как:

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

Но он выглядит слишком многословным, но вы можете добавить дополнительную логику, например когда данные не запрашивают поля. И если вам не нужна специальная логика, я думаю, что приведения достаточно.

+0

Я попробую это, когда вернусь домой, но из того, что я помню из своей оригинальной проблемы, проверка 'is' в вашем # 2 не удастся. Если я правильно помню, JavaScript, сгенерированный из проверки 'is', проверяет соответствие прототипов, которых они не будут, потому что все, что у меня есть, - это простой старый объект JavaScript без прототипа, просто полей. –

+0

Как я уже сказал в (1), мы не можем проверить конструктивно структуру по соображениям производительности. Я думаю, что общее решение будет дорогостоящим. – bashor

+0

Замечание для классов. '' '' '' '' Использует JS 'instanceof'. – bashor

0

Для второй части, бросок, вы можете сделать:

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

или

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

Это будет сгенерировано NPE, если полезная нагрузка равна нулю, но он не будет на самом деле проверить, что Полезная нагрузка соответствует MyModel. В частности, вы можете получить нулевые поля/свойства, которых не должно быть, если в полезной нагрузке отсутствовали эти поля/свойства.

+0

Это не работает, так как 'myModel' не будет иметь методов, которые мне нужны, как если бы у меня была настоящая« MyModel ». Кроме того, проверки равенства с перечислениями в 'myModel' потерпят неудачу. –

Смежные вопросы