2

我尝试为 JavaScript 库编写类型安全的包装器。我需要使用可变参数(例如method(args...))从 JavaScript 调用方法。Kotlin 的乐趣也应该适用于可变参数。因为 Kotlin 支持扩展运算符,所以我尝试使用它,但 Kotlin 不想要这个。

示例代码:

val jsLibrary: dynamic = require("library") // library given by node's require here
fun method(vararg args: String) = jsLibrary.method(*args)

编辑:忘记在代码中编写扩展运算符“*”。由于展开运算符,编译器返回错误。

Kotlin 编译器返回错误“无法在动态调用中应用扩展运算符”。

任何想法如何实现这样的包装器,还是我需要任何解决方法?

谢谢你的帮助!

4

1 回答 1

1

external fun@JsModule注释一起使用

@JsModule("library")
external fun method(vararg args: String): LibraryMethodReturnType

这将require("library")在引擎盖下为你做。您将拥有正确的 Kotlin 类型,而不是dynamic马上。您将没有“包装器”,这意味着在运行时没有额外的 JavaScript 调用。


如果您想手动使用requiredynamic键入,有一个 hacky 解决方案:使用apply方法将所有参数作为数组传递。

val jsLibrary: dynamic = require("library")
fun method(vararg args: String) = jsLibrary.method.apply(null, args)
于 2019-01-17T14:20:30.633 回答