我尝试为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)
编辑:已经忘记在代码中写入扩展运算符'*'。编译器由于使用了传播运算符而返回错误。
Kotlin编译器返回错误“无法在动态调用中应用传播运算符”。
任何想法如何实现这样的包装,还是我需要任何解决方法?
感谢您的帮助!
答案 0 :(得分:1)
将external fun
与@JsModule
批注一起使用
@JsModule("library")
external fun method(vararg args: String): LibraryMethodReturnType
这将为您提供require("library")
的帮助。您将立即拥有正确的Kotlin类型,而不是dynamic
。您将没有“包装器”,这意味着在运行时不会进行任何额外的JavaScript调用。
如果您要手动使用require
和dynamic
类型,则有一个解决方案:使用apply
方法将所有参数作为数组传递。
val jsLibrary: dynamic = require("library")
fun method(vararg args: String) = jsLibrary.method.apply(null, args)