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

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

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

8 ответов

Решение

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

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

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

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;

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

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

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

В моем проекте Kotlin/JS + React я написал адаптер для библиотеки, которая принимает анонимный объект конфигурации через конструктор. После некоторого поиска я нашел решение, используя kotlin.js.json

      val options = json(
    "position" to "top-right",
    "durations" to json(
        "global" to 20000
    )
)

Вот еще одно решение:
определите следующую вспомогательную функцию

fun jsObject(vararg pairs: Pair<Any, Any>): dynamic {
    val result = js("({})")
    for ((key, value) in pairs) {
        result[key] = value
    }
    return result
}

Затем вы можете использовать его следующим образом

val header = jsObject("content-type" to "text/plain", "content-length" to 50)

Я новичок из 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
}

Можно преобразовать обычный объект Kotlin в анонимный объект JavaScript с помощью JavaScript Object.assign(). Это позволяет вам оставаться в чистом Kotlin и в безопасности типов как можно дольше. Так:

fun Any.toJsObject(): dynamic {
    val thisArg = this                       // Allows use in js() function
    return js("Object.assign({},thisArg)")
}

val anObject = object { val a = "a" }        // Or use a regular class
console.log( anObject.toJsObject().a )       // logs "a"

Стандартная библиотека Kotlin/JS имеетJsonинтерфейс иjsonфабричная функция, принимающая переменный аргументPair<String, Any?>.

      val header = json(
  "content-type" to "text/plain",
  "content-length" to 50,
)
    
header["x-another-header"] = "foo"
Другие вопросы по тегам