【发布时间】:2020-08-08 15:50:18
【问题描述】:
考虑到以下 javascript 代码(部分取自 Apollo Server 文档),它创建了一个 ApolloServer 实例并启动它。
const {ApolloServer} = require('apollo-server')
const server = new ApolloServer({ ... });
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
现在考虑使用 KotlinJS 复制相同的行为。
首先,Kotlin 没有“new”关键字,按预期调用 ApolloServer() 将不起作用但会引发错误(TypeError: Class constructor ApolloServer cannot be invoked without 'new')。
// We can banally represent part of the code above like:
external fun require(module: String): dynamic
val ApolloServer = require("apollo-server").ApolloServer
// ApolloServer is a js class
声明一个外部类,如:
external open class ApolloServer() {
open fun listen(vararg opts: Any): Promise<Any>
operator fun invoke(): Any
}
并将其设置为 ApolloServer 类型没有帮助。
我们如何复制“new ApolloServer()”调用?
【问题讨论】:
-
对不起,我不知道 Kotlin,但如果它有 JS 互操作,则必须有一种惯用的方式来调用
new。一种创可贴的解决方法是实施function createServer(...) { return new ApolloServer(...) }? -
我不知道 K/JS 但你可能需要在没有 new 关键字的情况下调用它,它会实例化一个新实例。因为 Kotlin 中没有
new关键字(至少我们在 Kotlin/JVM 中所做的) -
谢谢:我可能会制作其他包含工厂的 js 文件,例如 createServer,然后导入它们。这与我最初认为的结论相同,但必须有办法避免这种做法。 AnimeshSahu:我也在 JVM 中使用 Kotlin,并开始将它与 node.js 一起使用。它非常强大,但缺少文档。很多时候我必须分析 javascript 输出以了解它是如何工作的,因为没有太多解释。
-
我找到的唯一解决方案是以下一个,但它没有按预期工作:discuss.kotlinlang.org/t/… 我将尝试对此进行一些实验并分享解决方案。
标签: javascript kotlin kotlin-js kotlin-js-interop