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"