我正在尝试用 Kotlin 编写一个小型 Node.js 应用程序来测试和使用 javascript 互操作。从公开原型(prototype)“Bar”的外部 Node 模块“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()
我能找到的唯一解决方法是通过 native JavaScript 代码实例化该对象:val bar = js("new foo.Bar()")
。这可行,但有一些缺点:
- 它不是类型安全的(这是使用 kotlin 之美的一部分)
- 它对变量 foo 有隐式依赖,在编译时不会检查该变量
- 该模块公开了许多具有不同构造函数参数集的此类对象,这将导致产生大量如上所述的 native 代码,这是我希望避免的
有什么方法可以实现这一点,最好是用纯 kotlin 吗?
最佳答案
我想你必须将 Bar
定义为模块 foo
中的外部类:
@JsModule("foo")
external class Bar {
...
}
参见https://kotlinlang.org/docs/reference/js-modules.html和 https://kotlinlang.org/docs/reference/js-interop.html
关于javascript - 从 kotlin 创建新的 Node 模块对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44642521/