Javascript анонимный объект в kotlin

Как создать анонимный объект JavaScript в kotlin? Я хочу создать именно этот объект для передачи в nodejs app

var header = {"content-type":"text/plain" , "content-length" : 50 ...}

Ответ 1

Возможные решения:

1) с функцией js:

val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})") 

Примечание: круглые скобки являются обязательными

2) с dynamic:

val d: dynamic = object{}
d["content-type"] = "text/plain"
d["content-length"] = 50

3) с js + dynamic:

val d = js("({})")
d["content-type"] = "text/plain"
d["content-length"] = 50

4) с объявлением native:

native
class Object {
  nativeGetter
  fun get(prop: String): dynamic = noImpl

  nativeSetter
  fun set(prop: String, value: dynamic) {}
}

fun main(args : Array<String>) {
  var o = Object()
  o["content-type"] = "text/plain"
  o["content-length"] = 50
}

Ответ 2

<ы > Еще одно возможное решение:

object {
        val `content-type` = "text/plain"
        val `content-length` = 50
}

Кажется, что он больше не работает с именами экранированных переменных.

Ответ 3

Я новичок Kotlin (хотя и не разработчик новичка), я немного расширил ответ от @bashor на что-то, что выглядит более аккуратно для ключей, которые являются действительными идентификаторами Java, но все же позволяет использовать те, которые не являются. Я тестировал его с помощью Kotlin 1.0.1.

@native("Object")
open class Object {
}

fun jsobject(init: dynamic.() -> Unit): dynamic {
    return (Object()).apply(init)
}

header = jsobject {
    validJavaIdentifier = 0.2
    this["content-type"] = "text/plain"
    this["content-length"] = 50
}

Ответ 4

Здесь вспомогательная функция для инициализации объекта с помощью синтаксиса лямбда

inline fun jsObject(init: dynamic.() -> Unit): dynamic {
    val o = js("{}")
    init(o)
    return o
}

Использование:

jsObject {
    foo = "bar"
    baz = 1
}

Изменил код javascript

var o = {};
o.foo = 'bar';
o.baz = 1;