vojtechhabarta / typescript-generator

Generates TypeScript from Java - JSON declarations, REST service client

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Usage of moduleDependencies breaks typing of map of enum and repeat inherited fields

CedricMtta opened this issue · comments

Hello,

FIrst of all, thanks for this project, it is much appreciated.

I may have missed the solution to my problem in the doc, but here is my issue:

I am using typescript-generator version 3.2.1263 with gradle.

I created one gradle sub module named "common-generator" that aims to create a file with common typescript classes enums for our front-end.

I defined for it the following configuration:

generateTypeScript {
  jsonLibrary = 'jackson2'
  classes = [
    ...
  ]
  outputKind = 'module'
  outputFileType = 'implementationFile'
  outputFile = '../<front end path>/common/models/common-backend.model.ts'
  generateInfoJson = 'true'
  noFileComment = 'true'
  sortDeclarations = 'true'
  sortTypeDeclarations = 'true'
  excludeClasses = [
    'java.io.Serializable',
    'org.springframework.data.util.Streamable',
    'org.springframework.data.domain.Chunk'
  ]
  mapEnum = 'asEnum'
  nonConstEnums = 'true'
  requiredAnnotations = ['javax.validation.constraints.NotNull']
}

So far so good, I obtain the expected common-backend.model.ts.
That is to say, I have some java fields defined as EnumMap

private Map<Language, String> synonymLabels;

that are well typed in typescript

synonymLabels?: { [P in Language]?: string };

Then, I created another gradle sub module named "businessA-generator" that aims to create a file with specific typescript classes for one of our front-end module.

I defined for it the following configuration:

generateTypeScript {
  jsonLibrary = 'jackson2'
  classes = [
...
  ]
  outputKind = 'module'
  outputFileType = 'implementationFile'
  outputFile = '../<front end path>/businessA/models/businessA-backend.model.ts'
  noFileComment = 'true'
  sortDeclarations = 'true'
  sortTypeDeclarations = 'true'
  moduleDependencies = [
    cz.habarta.typescript.generator.ModuleDependency.module('@shared/common/models/common-backend.model', 'common', new File('<front end path>/common/models/typescript-generator-info.json'), null, null)
  ]
  excludeClasses = [
    'java.io.Serializable',
    'org.springframework.data.util.Streamable'
  ]
  mapEnum = 'asEnum'
  nonConstEnums = 'true'
  requiredAnnotations = ['javax.validation.constraints.NotNull']
}

Here comes my issue.
Map of enums are now typed like this:

synonymLabels?: { [index: string]: string };

Whereas I would have expected:

synonymLabels?: { [P in common.Language]: string };

Other issue, but less impactful, in case of inheritance, the properties of the mother class are repeated.
For instance, the following java code

public interface Taggable {
  TagListDto getTagListDto();
}

public class OutComeTagGroup implements Taggable {

  private List<String> otherTags = new ArrayList<>();
  private List<String> resultCategoryTags = new ArrayList<>();
public TagListDto getTagListDto() {...}
}

Is generated into

(from common file)
export interface Taggable {
    tagListDto?: TagListDto;
}

(from another business file)
export interface OutComeTagGroup extends common.Taggable {
    otherTags?: string[];
    resultCategoryTags?: string[];
    tagListDto?: common.TagListDto;
}

Whereas I would expect

export interface OutComeTagGroup extends common.Taggable {
    otherTags?: string[];
    resultCategoryTags?: string[];
}

Inheritance taking place in the same typescript generated file doesn't have this issue.

Have I missed something in the plugin configuration, or is there an issue in typescript-generator ?

Thanks in advance for your help.

I wish you a nice day :)