Kotlin中的javascript匿名对象

u2nhd7ah  于 2023-03-19  发布在  Kotlin
关注(0)|答案(8)|浏览(162)

如何在Kotlin中创建JavaScript匿名对象?我想创建这个对象并将其传递给nodejs应用程序

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

cgfeq70w1#

可能的解决办法:
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
}
nmpmafwu

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;
yzxexxkh

yzxexxkh3#

还有一个可能的解决方案:

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

它似乎不再适用于转义变量名。

vngu2lb8

vngu2lb84#

在我的Kotlin/JS + React项目中,我为一个通过构造函数接受匿名配置对象的库编写了一个适配器,经过一段时间的搜索,我找到了一个使用kotlin.js.json的解决方案

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

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

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

qq24tv8q7#

可以使用JavaScript的Object.assign()将常规Kotlin对象转换为JavaScript匿名对象,这允许您尽可能长时间地保持纯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"
disho6za

disho6za8#

Kotlin/JS标准库有一个Json接口,以及一个json工厂函数,该函数接受变量Pair<String, Any?>

val header = json(
  "content-type" to "text/plain",
  "content-length" to 50,
)
    
header["x-another-header"] = "foo"

相关问题