diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java index 4c2d3a200e5e..a5233738ace1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java @@ -1499,11 +1499,16 @@ public class ExtendedCodegenModel extends CodegenModel { public Set oneOfArrays = new TreeSet<>(); @Getter @Setter public Set oneOfPrimitives = new HashSet<>(); - + @Getter @Setter + public CodegenDiscriminator.MappedModel selfReferencingDiscriminatorMapping; + public boolean isEntity; // Is a model containing an "id" property marked as isUniqueId public String returnPassthrough; public boolean hasReturnPassthroughVoid; - + + public boolean hasSelfReferencingDiscriminatorMapping(){ + return selfReferencingDiscriminatorMapping != null; + } public boolean isDateType() { return isDate && "Date".equals(dataType); } @@ -1597,6 +1602,15 @@ public ExtendedCodegenModel(CodegenModel cm) { this.setAdditionalProperties(cm.getAdditionalProperties()); this.setIsModel(cm.getIsModel()); this.setComposedSchemas(cm.getComposedSchemas()); + if (this.discriminator != null) { + Set mappedModels = this.discriminator.getMappedModels(); + for(CodegenDiscriminator.MappedModel mappedModel : mappedModels) { + if(mappedModel.getModelName().equals(cm.classname)){ + this.discriminator.getMappedModels().remove(mappedModel); + this.selfReferencingDiscriminatorMapping=mappedModel; + } + } + } } @Override diff --git a/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache b/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache index cef7f6bd1959..16f2f4336212 100644 --- a/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-fetch/modelGeneric.mustache @@ -47,6 +47,12 @@ export function {{classname}}FromJSONTyped(json: any, ignoreDiscriminator: boole return {{modelName}}FromJSONTyped(json, ignoreDiscriminator); } {{/discriminator.mappedModels}} + {{#hasSelfReferencingDiscriminatorMapping}} + if (json['{{discriminator.propertyBaseName}}'] === '{{selfReferencingDiscriminatorMapping.mappingName}}') { + return {{selfReferencingDiscriminatorMapping.modelName}}FromJSONTyped(json, true); + } + {{/hasSelfReferencingDiscriminatorMapping}} + } {{/discriminator}} return {