43

I have found the ts2kt library which will create Kotlin header files from arbitrary .d.ts files. But, I want to go in the opposite direction.

I want to build a Kotlin library that will compile to JavaScript, but I want to use it from TypeScript. Is there a way to make Kotlin generate a .d.ts file(s) from its exposed interfaces? Am I approaching this the right way?

3
  • 2
    kotlin does not map 1-to-1 to javascript as typescript does so even if such tool existed, kotlin types would not represent the generated javascript all the time Commented Mar 1, 2017 at 17:56
  • AFAIK such tool is not exist (yet) Commented Mar 1, 2017 at 20:09
  • 5
    related issue: youtrack.jetbrains.com/issue/KT-16604 Commented Mar 6, 2017 at 19:09

2 Answers 2

2

In Kotlin 1.4-M1 support for exporting TypeScript definitions was added

Preview: TypeScript definitions

Another feature in the new Kotlin/JS IR compiler we’re excited to show off is the generation of TypeScript definitions from Kotlin code. These definitions can be used by JavaScript tools and IDEs when working on hybrid apps to provide autocompletion, support static analyzers, and make it easier to include Kotlin code in JS and TS projects.

For top-level declarations marked with @JsExport (see above) in a project configured to use produceExecutable(), a .d.ts file with the TypeScript definitions will be generated. For the snippet above, they look like this:

// [...]
namespace blogpost {
    class KotlinGreeter {
        constructor(who: string)
        greet(): string
    }
    function farewell(who: string): string
}
// [...]

In Kotlin 1.4-M1, these declarations can be found in build/js/packages/<package_name>/kotlin alongside the corresponding, un-webpacked JavaScript code. Please note that since this is only a preview, they are not added to the distributions folder by default for now. You can expect this behavior to change in the future.

Sign up to request clarification or add additional context in comments.

Comments

1

I'm looking to do something like this to share models between Android and JS. There is the ts-generator library, which takes jvm classes and generates ts definitions from them.

I haven't tried this yet, but it theoretically should work. Separate the API for your library (or an interface the api implements) into a kotlin common module. You can then compile the api into a jvm module, and run it through the ts-generator to generate ts definitions.

Maybe there is a clever way to do this to skip the compilation to jvm for ts definition generation.

1 Comment

If you're looking for an easy way to try ts-generator, check out the ktsgenerator Gradle plugin

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.