Javascript 使用 Kotlin JS 的结构表示
Javascript structure representation using Kotlin JS
我的问题是关于在 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 表示上面的配置结构?有没有一种简单的方法来处理 structures/json Kotlin 端?我们能否以某种方式将该结构声明为动态的?
使用 Kotlin 对象没有帮助。
到现在为止,你必须介绍接口及其实现,所以它会是这样的:
external interface ConfigInterface {
var defs: String,
var resolvers: QueryHolder
}
external interface QueryHolder {
var Query: BookProcessor
}
external interface BookProcessor {
var books: () -> Array<Any>
}
对于更复杂的结构,它很容易成为一个挑战。
以下是自动化此类翻译的方法。
您可以:
- 使用 typescript 编译器(使用
tsc -d
)为此代码生成 typescript 声明
- 使用 dukat 生成 kotlin 声明。
Dukat 是 Kotlin/JS 团队专门为此创建的工具,ongoing battle 用于提高此工具的质量。以下是在您的特定情况下会生成的内容:
external interface `T[=11=]` {
var books: () -> Array<Any>
}
external interface `T` {
var Query: `T[=11=]`
}
external object config {
var defs: String
var resolvers: `T`
}
这远非最佳 - 例如生成的实体的名称是我们不想鼓励人们重复使用的东西,但它越多,它看起来就越像一个错误(我们将以这种方式修复或其他)。
我的问题是关于在 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 表示上面的配置结构?有没有一种简单的方法来处理 structures/json Kotlin 端?我们能否以某种方式将该结构声明为动态的? 使用 Kotlin 对象没有帮助。
到现在为止,你必须介绍接口及其实现,所以它会是这样的:
external interface ConfigInterface {
var defs: String,
var resolvers: QueryHolder
}
external interface QueryHolder {
var Query: BookProcessor
}
external interface BookProcessor {
var books: () -> Array<Any>
}
对于更复杂的结构,它很容易成为一个挑战。 以下是自动化此类翻译的方法。 您可以:
- 使用 typescript 编译器(使用
tsc -d
)为此代码生成 typescript 声明 - 使用 dukat 生成 kotlin 声明。
Dukat 是 Kotlin/JS 团队专门为此创建的工具,ongoing battle 用于提高此工具的质量。以下是在您的特定情况下会生成的内容:
external interface `T[=11=]` {
var books: () -> Array<Any>
}
external interface `T` {
var Query: `T[=11=]`
}
external object config {
var defs: String
var resolvers: `T`
}
这远非最佳 - 例如生成的实体的名称是我们不想鼓励人们重复使用的东西,但它越多,它看起来就越像一个错误(我们将以这种方式修复或其他)。