You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin JS:如何通过index.d.ts生成Express包装器?

借助Express的index.d.ts生成Kotlin JS包装器的可行方案

完全可以通过Express的TypeScript类型定义文件(index.d.ts)生成对应的Kotlin JS包装器,Kotlin官方提供了工具支持这类转换,具体步骤如下:

1. 获取Express的TypeScript类型定义

首先确保你安装了@types/express包(Express核心包本身不带类型定义),可以通过npm安装:

npm install @types/express --save-dev

安装完成后,类型定义文件会位于node_modules/@types/express/index.d.ts。

2. 使用ts2kt转换类型定义

ts2kt是Kotlin官方提供的命令行工具,专门用于将TypeScript .d.ts 文件转换为Kotlin外部声明(即你需要的包装器)。

运行以下命令完成转换:

ts2kt -d ./kotlin-express-decls ./node_modules/@types/express/index.d.ts
  • -d ./kotlin-express-decls 指定转换后的Kotlin文件输出目录
  • 最后一个参数是目标.d.ts文件的路径

3. 将生成的包装器引入项目

转换完成后,kotlin-express-decls目录下会生成一系列.kt格式的外部声明文件,将这些文件复制到你的Kotlin JS项目的src/main/kotlin目录下,或者作为单独的模块依赖引入。

4. 手动调整(必要时)

ts2kt的转换并非100%完美,遇到复杂的TypeScript语法(比如高级泛型、条件类型、扩展接口)时,可能会生成存在语法错误的Kotlin代码。此时需要你手动修正这些错误,比如调整泛型约束、修正函数签名等。

示例:在Kotlin JS中使用生成的包装器

转换并调整完成后,你就可以像使用原生Express一样在Kotlin代码中编写逻辑:

import express.*

fun main() {
    val app = express()
    val port = 3000

    app.get("/") { req, res ->
        res.send("Hello from Kotlin JS + Express!")
    }

    app.listen(port) {
        println("Server listening on http://localhost:$port")
    }
}

Gradle自动化配置(可选)

如果使用Gradle构建项目,可以添加自定义任务自动执行转换:

plugins {
    kotlin("js") version "1.9.20"
}

kotlin {
    js {
        nodejs()
        binaries.executable()
    }

    sourceSets.main {
        dependencies {
            implementation(npm("express", "4.18.2"))
            implementation(npm("@types/express", "4.17.21"))
        }
    }
}

tasks.register("generateExpressDeclarations") {
    doLast {
        exec {
            commandLine("npx", "ts2kt", "-d", "src/main/kotlin/express", "node_modules/@types/express/index.d.ts")
        }
    }
}

运行./gradlew generateExpressDeclarations即可自动生成并更新包装器。

内容的提问来源于stack exchange,提问作者László Stahorszki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:57:32