Создать Typescript Интерфейсы от интерфейсов Java

У меня есть серверное приложение Java, которое использует Jackson для генерации сериализации DTO с помощью API отражения. Например, для этого интерфейса DTO:

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

Из реализации POJO этого интерфейса Джексон будет генерировать сериализацию следующего объекта:

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

Эта полезная нагрузка будет получена с помощью HTTP GET из моего приложения TypeScript, которое основано на AngularJS:

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

Чтобы я мог использовать строго типизированный характер TypeScript, я обнаружил, что кодирую следующий интерфейс TypeScript:

module com.acme.library {
  export interface Book {
      author: com.acme.library.Author;
      title: String;
  }
}

В результате я должен поддерживать две копии этого же интерфейса, что в лучшем случае является громоздким. Это особенно неприятно, так как я хотел бы иметь те же комментарии javadoc/jsdoc на обоих интерфейсах, что подразумевает целую кучу copy & paste.


Я хотел бы найти механизм для автоматизации этого процесса.

Java - это мой основной язык разработки. Таким образом, я хотел бы найти инструмент, способный конвертироваться из декларации интерфейса Java (через API отображения) в соответствующий интерфейс TypeScript.

Единственным инструментом, который я обнаружил в этом домене, является пакет NPM ts-java. Однако, это слишком тяжело для моего случая использования. Он добавляет методы из иерархии объектов в каждый интерфейс, например. hashCode(), wait(), getClass() и т.д.

Ответ 1

Вы можете использовать генератор текстов, как уже упоминалось. Он генерирует интерфейсы TypeScript из классов Java JSON. Некоторые функции, которые вы можете найти полезными:

  • Плагин Maven и Gradle (также может быть вызван непосредственно из Java)
  • Джексон 1 и Джексон 2
  • коллекции, перечисления, наследование, дженерики
  • Комментарии Javadoc к комментариям JSDoc
  • подробная документация (README, Wiki, плагин Maven)
  • релизы в Maven центральном репо

Вот пример того, как использовать его от 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.

Изменение: я автор машинописного генератора.

Ответ 2

Мне повезло с Amdatu TypeScript Generator

Он может работать в Gradle или автономно от терминала (я использовал терминал, так что эти инструкции здесь)

Просто выполните клонирование репо, запустите ./gradlew, чтобы создать его.

Чтобы выполнить его, мне пришлось немного отклониться от их инструкций, потому что в банке не было точки входа (у вас не было бы этой проблемы, если вы используете конструкцию Gradle, потому что она будет указывать класс записи).

Я использовал:

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

Затем он должен жаловаться, что нет файла typescript.settings.json, который он ожидает в директории, из которой вы запускаете команду.

Я включу свой собственный пример, потому что связанный файл настроек примера репо немного неясен:

{
  "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 - это каталог, в который будут помещаться файлы определения TypeScript, относительно того, где вы выполняете генератор
  • packages - это регулярное выражение java, для которого пакеты должны быть преобразованы в определения TypeScript

Ответ 3

В настоящее время я работаю над проектом с той же настройкой, что и ваш: API Java и веб-приложение Typescript.

Мы используем cz.habarta.typescript-generator.typescript-generator-maven-plugin для генерации файлов .d.ts при создании API. Файлы определения затем упаковываются как артефакт с <type>d.ts</type>, используя org.codehaus.mojo.build-helper-maven-plugin. Наконец, артефакт импортируется как зависимость в веб-приложении, где файлы определения распаковываются в каталог target.

Для этой настройки требуется, чтобы вы использовали maven для веб-приложения, что не идеально, но это небольшая плата за автоматическое создание файлов определений.

Ответ 4

Как таковой, я хотел бы найти инструмент, способный преобразовать его из декларации интерфейса Java (через API отображения) в соответствующий интерфейс TypeScript.

Вы можете сначала взглянуть на эти образцы. Я не переносил функцию java → TypeScript в автономный инструмент CLI (из всего проекта), но это легко сделать.

Ответ 5

Вы можете использовать Script4J, который представляет собой набор библиотек для кодирования в TypeScript с использованием Java API. Хотя это новый проект, он может быть полезен.

Ответ 6

Я создал новый проект с целью максимально упростить процесс переноса: JavaModel-Converter

Он работает с ide или просто из командной строки, выполняя jar файл в папке dist.

Все, что вам нужно, это поместить вашу Java-модель в нужную папку и начать процесс переноса.

Я добавил также поддержку стиля Angular.

Пусть открытые вопросы, если у вас есть запросы!

Теоретически мой проект - это общий конвертер моделей Java, но на самом деле поддерживается только транспонирование Typescript.