我正在尝试在Kotlin中编写一个小的node.js应用程序来测试和使用javascript互操作 . 从暴露原型'Bar'的外部节点模块'foo',我试图创建一个新的'Bar'实例 .
在Javascript中,我只想写一些类似的东西
var foo = require('foo')
var bar = new foo.Bar()
在Kotlin中,我定义了一个外部函数'require'并加载了按预期工作的模块:
external fun require(module: String): dynamic
...
val foo = require("foo")
//Somehow create a new Bar
现在我想创建一个新的Bar实例 . 到目前为止,我已经尝试过:
-
调用
val bar = foo.Bar()
. 这被解释为功能,因此不起作用 . -
定义外部类Bar并创建新对象
val bar = Bar()
我能找到的唯一解决方法是通过本机javascript代码实例化对象: val bar = js("new foo.Bar()")
. 这有效,但有一些缺点:
-
它不是类型安全的(这是使用kotlin之美的一部分)
-
它对变量foo有一个隐式依赖,它在编译时没有被检查过
-
该模块使用不同的构造函数参数公开许多此类对象,这将导致如上所述的大量本机代码,我想避免
有没有办法实现这一目标,特别是纯粹的kotlin?
1 回答
我想你必须将
Bar
定义为模块foo
的外部类:见https://kotlinlang.org/docs/reference/js-modules.html和https://kotlinlang.org/docs/reference/js-interop.html