从Java接口生成Typescript接口

时间:2015-09-08 07:42:02

标签: java typescript

我有一个Java服务器应用程序,它使用Jackson一般使用反射API序列化DTO。例如,对于此DTO界面:

->addAttributeToSelect('productcategory')

从这个界面的POJO实现中,Jackson将统一序列化以下实体:

package com.acme.library;
public interface Book { 
  com.acme.library.Author getAuthor();
  String getTitle();
}

将使用我的TypeScript应用程序(基于AngularJS)的HTTP GET接收此有效负载:

{
   "author": { "name": "F. Scott Fitzgerald"},
   "title": "The Great Gatsby"
}

为了能够使用TypeScript的强类型特性,我发现自己手工编写了以下的typescript接口:

$http.get("http://localhost/books/0743273567")
   .success((book: Book) => { ... });

因此,我必须保留这个相同界面的两个副本 - 这最多是麻烦的。这特别令人讨厌,因为我想在两个接口上都有相同的javadoc / jsdoc注释,这涉及到一大堆复制和粘贴。

我想找到一种自动化此过程的机制。

Java是我的主要开发语言。因此,我想找到一些能够从Java接口声明(通过反射API?)转换到相关TypeScript接口的工具。

我在此域中发现的唯一工具是NPM包module com.acme.library { export interface Book { author: com.acme.library.Author; title: String; } } 。但是,这对我的用例来说太重了。它将Object层次结构中的方法添加到每个接口,例如ts-javahashCode()wait()

5 个答案:

答案 0 :(得分:13)

您可以使用typescript-generator作为larslonne。它从Java JSON类生成TypeScript接口。您可能会发现一些有用的功能:

  • Maven和Gradle插件(也可以直接从Java调用)
  • 杰克逊1和杰克逊2
  • 集合,枚举,继承,泛型
  • Javadoc对JSDoc评论的评论
  • 详细文档(README,Wiki,Maven插件)
  • 在Maven central repo中发布

以下是如何在Maven中使用它的示例:

<plugin>
    <groupId>cz.habarta.typescript-generator</groupId>
    <artifactId>typescript-generator-maven-plugin</artifactId>
    <version>1.25.322</version>
    <executions>
        <execution>
            <id>generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <phase>process-classes</phase>
            <configuration>
                <jsonLibrary>jackson2</jsonLibrary>
                <classes>
                    <class>com.acme.library.Book</class>
                </classes>
                <outputFile>target/rest.d.ts</outputFile>
                <outputKind>module</outputKind>
            </configuration>
        </execution>
    </executions>
</plugin>

修改:使用mvn process-classes或稍后的阶段mvn install运行它 您还可以向上提取<configuration>元素两个级别并运行mvn typescript-generator:generate

编辑:我是typescript-generator的作者。

答案 1 :(得分:3)

我很幸运Amdatu TypeScript Generator

它可以在Gradle中运行,也可以从终端独立运行(我使用了终端,这就是这些说明的内容)

只需克隆回购,运行./gradlew即可构建它。

为了执行它,我不得不偏离他们的指示,因为jar中没有入口点(如果使用gradle构建,则不会出现此问题,因为它会指定入口类)。 / p>

我用过:

java -cp build/libs/org.amdatu.typescriptgenerator-1.0-SNAPSHOT.jar org.amdatu.typescriptgenerator.standalone.TypeScriptGeneratorStarter

然后它应该抱怨没有typescript.settings.json文件,它在您运行命令的目录中期望它。

我将包含我自己的示例,因为链接的repo的示例设置文件有点不清楚:

{
  "folder" : "/projectsfolder/project",
  "classFolder" : "target/classes",
  "output" : "typscriptOutputDirectory",
  "baseFolder" : "",
  "clearOutput" : false,
  "packages" : [
    ".*regexforwhatpackagesinsidetargetprojectshouldbeturnedintotypescript.*"
  ],
  "excludePackages" : [ ],
  "excludePattern" : [ ],
  "types" : { },
  "mapping" : { },
  "enumType" : "class",
  "classType" : "interface",
  "classPath" : [ ]
}

设置中最重要的字段是:

  • folder已构建项目
  • 的地方
  • classFolder是此生成器将在该文件夹中查找已编译的java类
  • 的位置
  • output是要放置打字稿定义文件的目录,相对于执行生成器的位置
  • packages是一个java正则表达式,用于将哪些包转换为TypeScript定义

答案 2 :(得分:2)

我目前正在开发一个与您的设置相同的项目:Java API和Typescript Web应用程序。

我们在构建API时使用cz.habarta.typescript-generator.typescript-generator-maven-plugin生成.d.ts文件。然后使用<type>d.ts</type>将定义文件打包为org.codehaus.mojo.build-helper-maven-plugin的工件。最后,工件将作为Web应用程序中的依赖项导入,其中定义文件将解压缩到target目录中。

此设置要求您将maven用于Web应用程序,这并不理想,但为自动生成的定义文件付出的代价很小。

答案 3 :(得分:1)

我创建了一个新项目,目的是使转译过程尽可能简单:JavaModel-Converter

它可以与ide一起使用,或者仅通过命令行执行存在于dist文件夹中的jar。

您需要做的就是将Java模型放入所需的文件夹中,然后开始进行翻译过程。

我还添加了Angular样式支持。

如果您有任何要求,请公开!

从理论上讲,我的项目是一个通用的Java模型转换器,但实际上,仅支持Typescript转译

答案 4 :(得分:0)

您可以使用Script4J(这是一组库)来使用Java API在TypeScript中进行编码。尽管这是一个新项目,但可能会很有用。