【问题标题】:Javascript structure representation using Kotlin JS使用 Kotlin JS 的 Javascript 结构表示
【发布时间】:2020-08-11 09:51:03
【问题描述】:

我的问题是关于在 KotlinJS 中创建 javascript 结构并使用它们调用外部模块。 假设我们有以下 js 代码,我们想将其翻译成 KotlinJS。

const config = {
defs : "something",
resolvers : {
  Query: {
    books: () => []
  }}
};

myFunction(config) // This can be any kind of external js function that accepts the above structure

我们如何使用 Kotlin JS 来表示上面的配置结构?有没有一种简单的方法来处理结构/json Kotlin 方面?我们可以以某种方式声明该结构是动态的吗? 使用 Kotlin 对象没有帮助。

【问题讨论】:

    标签: kotlin-js kotlin-js-interop


    【解决方案1】:

    现在你必须介绍接口和它的实现,所以它应该是这样的:

    external interface ConfigInterface {
      var defs: String,
      var resolvers: QueryHolder
    }
    
    external interface QueryHolder {
       var Query: BookProcessor
    }
    
    external interface BookProcessor {
       var books: () -> Array<Any>
    }
    

    对于更复杂的结构,它很容易成为一个挑战。 以下是自动化此类翻译的方法。 你可以:

    • 使用 typescript 编译器为此代码生成 typescript 声明(使用 tsc -d
    • 使用 dukat 生成 kotlin 声明。

    Dukat 是 Kotlin/JS 团队专门为此创建的工具,ongoing battle 用于提高此工具的质量。以下是在您的特定情况下会生成的内容:

    external interface `T$0` {
        var books: () -> Array<Any>
    }
    
    external interface `T$1` {
        var Query: `T$0`
    }
    
    external object config {
        var defs: String
        var resolvers: `T$1`
    }
    

    这远非最佳 - 例如,生成实体的名称是我们不想鼓励人们重用的东西,但它越多,它看起来就越像一个错误(我们将通过这种或其他方式修复)。

    【讨论】:

    • 我很了解你。我确实阅读了 dukat 代码的一部分,并且见过你很多次。它帮助我更好地理解如何处理 Kotlin/JS 互操作性。我很高兴你回答,那是我所缺少的。我使用的是对象而不是接口,生成的代码不是我所期望的。我确实在 Kotlin 讨论中问过同样的问题,但没有人回答 => discuss.kotlinlang.org/t/… 如果你不介意我也可以把你的答案放在那里,提到你是作者。我可以?谢谢
    • @Jac 当然,您可以随意引用/链接任何公开答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多