如何在Kotlin中创建JavaScript匿名对象?我想创建这个对象并将其传递给nodejs应用程序
var header = {“content-type”:”text/plain” , “content-length” : 50 ...}
cgfeq70w1#
可能的解决办法:1)使用js函数:
js
val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})")
注意:括号是强制性的2)使用dynamic:
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 }
nmpmafwu2#
下面是一个helper函数,用于使用lambda语法初始化对象
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;
yzxexxkh3#
还有一个可能的解决方案:
object { val `content-type` = "text/plain" val `content-length` = 50 }
它似乎不再适用于转义变量名。
vngu2lb84#
在我的Kotlin/JS + React项目中,我为一个通过构造函数接受匿名配置对象的库编写了一个适配器,经过一段时间的搜索,我找到了一个使用kotlin.js.json的解决方案
kotlin.js.json
val options = json( "position" to "top-right", "durations" to json( "global" to 20000 ) )
vhipe2zx5#
我是一个Kotlin新手(虽然不是一个新手开发人员),我稍微扩展了答案从@bashor到一些看起来更整洁的键,这些键是有效的Java标识符,但仍然允许那些不是。
@JsName("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 }
inb24sb26#
下面是另一个解决方案:定义以下帮助器函数
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)
qq24tv8q7#
可以使用JavaScript的Object.assign()将常规Kotlin对象转换为JavaScript匿名对象,这允许您尽可能长时间地保持纯Kotlin和类型安全。
Object.assign()
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"
disho6za8#
Kotlin/JS标准库有一个Json接口,以及一个json工厂函数,该函数接受变量Pair<String, Any?>。
Json
json
Pair<String, Any?>
val header = json( "content-type" to "text/plain", "content-length" to 50, ) header["x-another-header"] = "foo"
8条答案
按热度按时间cgfeq70w1#
可能的解决办法:
1)使用
js
函数:注意:括号是强制性的
2)使用
dynamic
:3)其中
js
+dynamic
:4)使用本机声明:
nmpmafwu2#
下面是一个helper函数,用于使用lambda语法初始化对象
用法:
发出的javascript代码
yzxexxkh3#
还有一个可能的解决方案:
它似乎不再适用于转义变量名。
vngu2lb84#
在我的Kotlin/JS + React项目中,我为一个通过构造函数接受匿名配置对象的库编写了一个适配器,经过一段时间的搜索,我找到了一个使用
kotlin.js.json
的解决方案vhipe2zx5#
我是一个Kotlin新手(虽然不是一个新手开发人员),我稍微扩展了答案从@bashor到一些看起来更整洁的键,这些键是有效的Java标识符,但仍然允许那些不是。
inb24sb26#
下面是另一个解决方案:
定义以下帮助器函数
然后,您可以按如下方式使用它
qq24tv8q7#
可以使用JavaScript的
Object.assign()
将常规Kotlin对象转换为JavaScript匿名对象,这允许您尽可能长时间地保持纯Kotlin和类型安全。disho6za8#
Kotlin/JS标准库有一个
Json
接口,以及一个json
工厂函数,该函数接受变量Pair<String, Any?>
。