从kotlin创建新的节点模块对象

我正在尝试在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)

2 years ago

我想你必须将 Bar 定义为模块 foo 的外部类:

@JsModule("foo")
external class Bar {
   ...
}

https://kotlinlang.org/docs/reference/js-modules.htmlhttps://kotlinlang.org/docs/reference/js-interop.html