【问题标题】:Using Kotlin standard library from JavaScript在 JavaScript 中使用 Kotlin 标准库
【发布时间】:2019-12-22 02:41:18
【问题描述】:

我编写了一个使用 List<String> 的 Kotlin 函数。该函数有一个带有@JsName 的注释,以便我可以从 JavaScript 调用此函数。我无法确定我应该传递给这个函数的内容。传递 JavaScript 数组不起作用,因为 Kotlin-JS 代码在对象上调用 iterator。此外,Kotlin 标准库中的名称都是错误的;所以我不能以任何可靠的方式在 JavaScript 中调用 listOf 并将结果传递给函数。

那么问题是,如果 Kotlin 标准库名称被破坏,我们应该如何创建并传递给对象函数,而不是琐碎的类型(数字、字符串等)?

【问题讨论】:

    标签: javascript kotlin kotlin-js kotlin-js-interop


    【解决方案1】:

    您可以在 Kotlin 中与 JavaScript 互操作时使用 ArrayList,因为 List 是一个接口(不在 JavaScript 中),并且(其中一个)实际实现是 ArrayList

    当您处理List<String> 时,您可以在 JavaScript 中执行此操作:

    let list = new kotlin.kotlin.collections.ArrayList(["foo","bar","baz"])
    

    您可以将list 变量传递给需要List<String> 参数的函数。

    备注:

    1. 如果您的某些 Kotlin 函数返回 List,您可以调用 list.toArray() 将 List 从 Kotlin 转换回 JavaScript 数组。
    2. 我会声明“中间人”(适配器)函数,将项目推送到List,接受MutableList 并调用add,因为库函数被破坏了。 (我也想要一个更合适的方法)
    3. 如果您需要处理自定义对象列表,例如Foo 的班级,你应该可以打电话给new <package>.<identifier>...Foo(params)

    【讨论】:

    • 谢谢,我会尽快调查。我似乎记得所有的 kotlin 包名称都被弄乱了,但也许有些我没有注意到。是否有一些您知道的编译器标志可以保证 kotlin.kotlin.collections.* 没有被破坏或类名没有被破坏?
    • kotlin.kotlin.collections.* 来自kotlin.js,它与编译的 Kotlin 源代码一起生成为共享库。 (我从 NPM “要求”它)类名没有被破坏,但函数名是。
    • 非常感谢!我不确定如何从 ArrayList 转换为常规 Javascript 数组。 toArray() 成功了!
    猜你喜欢
    • 2019-01-22
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2017-09-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多