gpt4 book ai didi

javascript - 在 Kotlin JS 中实例化期望 "new"关键字的 Javascript 类

转载 作者:行者123 更新时间:2023-12-01 15:42:08 24 4
gpt4 key购买 nike

考虑以下 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:没有'new'就无法调用类构造函数ApolloServer)。

// 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()”调用?

最佳答案

为了解决这个问题,我发现了一种基于 JsModule 注解的有趣方法。我们需要创建一个 Kotlin 文件来代表我们要导入的那个 javascript 模块,在我的例子中是“apollo-server”。

@file:JsModule("apollo-server")
@file:JsNonModule
package com.package

import kotlin.js.Promise

external interface ServerInfo {
var address: String
var family: String
var url: String
var subscriptionsUrl: String
var port: dynamic /* Number | String */
get() = definedExternally
set(value) = definedExternally
var subscriptionsPath: String
var server: Any
}

external open class ApolloServer(config: Any? /* ApolloServerExpressConfig & `T$0` */) : Any {
open var httpServer: Any
open var cors: Any
open var onHealthCheck: Any
open var createServerInfo: Any
open fun applyMiddleware()
open fun listen(vararg opts: Any): Promise<ServerInfo>
open fun stop(): Promise<Unit>
}

通过上面的代码,我们基本上描述了我们期望在 apollo-server 模块中找到的内容以及如何将其映射到 Kotlin 中。

在我们的 Kotlin 主函数中,我们不必指定任何 require(...) ,只需使用我们的 ApolloServer 类,例如:

    ApolloServer(null).listen().then {
console.log(it)
}

使用这种方法,Kotlin 将使用 javascript 中的 new 关键字正确地转换它。

转译版本提取:

  function main$lambda(it) {
console.log(it);
return Unit;
}
function main() {
(new ApolloServer(null)).listen().then(main$lambda);
}

这段代码只是一个例子,如果没有适当的配置,ApolloServer 不会被初始化,例如,这个例子包含一个可以为空的配置。

关于javascript - 在 Kotlin JS 中实例化期望 "new"关键字的 Javascript 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61419100/

24 4 0
文章推荐: javascript - 有没有一种优雅的方式使用 TypeORM 在 OneToMany 关系数组中查找一条记录并将其分配给实体中的另一个字段?
文章推荐: java - 适配器和 ListView
文章推荐: javascript - 单击按钮(JS)时,如何使
文章推荐: Java 精度测试编号
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com