Kotlin:调用 JavaScript 方法时的扩展运算符
Kotlin: Spread operator on calling JavaScript method
我尝试为 JavaScript 库编写一个类型安全的包装器。
我需要使用可变参数从 JavaScript 调用一个方法
(例如 method(args...)
)。
Kotlin 对此的乐趣也应该适用于可变参数。
因为Kotlin支持展开运算符,所以我尝试使用它,但是Kotlin不需要这个。
示例代码:
val jsLibrary: dynamic = require("library") // library given by node's require here
fun method(vararg args: String) = jsLibrary.method(*args)
编辑:已经忘记在代码中编写展开运算符“*”。由于展开运算符,编译器 returns 出错。
Kotlin 编译器returns 错误"Can't apply spread operator in dynamic call"。
关于如何实现这样的包装器的任何想法,或者我需要任何解决方法吗?
感谢您的帮助!
使用external fun
with @JsModule
注释
@JsModule("library")
external fun method(vararg args: String): LibraryMethodReturnType
这将在幕后为您 require("library")
。您将立即拥有正确的 Kotlin 类型,而不是 dynamic
。您将没有 "wrappers",这意味着在运行时没有额外的 JavaScript 调用。
如果你想手动使用 require
和 dynamic
类型,有一个 hacky 解决方案:使用 apply
方法将所有参数作为数组传递。
val jsLibrary: dynamic = require("library")
fun method(vararg args: String) = jsLibrary.method.apply(null, args)
我尝试为 JavaScript 库编写一个类型安全的包装器。
我需要使用可变参数从 JavaScript 调用一个方法
(例如 method(args...)
)。
Kotlin 对此的乐趣也应该适用于可变参数。
因为Kotlin支持展开运算符,所以我尝试使用它,但是Kotlin不需要这个。
示例代码:
val jsLibrary: dynamic = require("library") // library given by node's require here
fun method(vararg args: String) = jsLibrary.method(*args)
编辑:已经忘记在代码中编写展开运算符“*”。由于展开运算符,编译器 returns 出错。
Kotlin 编译器returns 错误"Can't apply spread operator in dynamic call"。
关于如何实现这样的包装器的任何想法,或者我需要任何解决方法吗?
感谢您的帮助!
使用external fun
with @JsModule
注释
@JsModule("library")
external fun method(vararg args: String): LibraryMethodReturnType
这将在幕后为您 require("library")
。您将立即拥有正确的 Kotlin 类型,而不是 dynamic
。您将没有 "wrappers",这意味着在运行时没有额外的 JavaScript 调用。
如果你想手动使用 require
和 dynamic
类型,有一个 hacky 解决方案:使用 apply
方法将所有参数作为数组传递。
val jsLibrary: dynamic = require("library")
fun method(vararg args: String) = jsLibrary.method.apply(null, args)