swagger-api / swagger-codegen

swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.
http://swagger.io
Apache License 2.0
16.87k stars 6.02k forks source link

[TypeScript-Fetch] Invalid interface definition when using additionalProperties #4839

Open ranma42 opened 7 years ago

ranma42 commented 7 years ago
Description

Compiling the following spec into a TypeScript-Fetch client results in invalid code. Specifically, the generated code contains

export interface GenericMap extends null<String, number> {
}

which the TypeScript compiler rejects.

Swagger-codegen version

I tested it on 2.2.1 (latest stable) and 2.3.0 (7aebcfa).

Swagger declaration file content or url
...
definitions:
  GenericMap:
    additionalProperties:
      type: integer
  Container:
    type: object
    properties:
      works:
        type: object
        additionalProperties:
          type: string
      breaks:
        $ref: "#/definitions/GenericMap"
Command line used for generation

swagger-codegen generate -i test.yaml -l typescript-fetch

Steps to reproduce

Compile a swagger API containing the definitions mentioned above into a typescript-fetch client.

Suggest a Fix

The Container type shows that additionalProperties are correctly handled in some cases (when used for the anonymous type of the works member), but not when they are used for a type which is basically a map. I believe it would be sufficient to emit the following type, without inheriting from any other type:

export interface GenericMap {
  [key: string]: number;
}
wing328 commented 7 years ago

@ranma42 thanks for reporting the issue. Can you try the latest master, which uses swagger parser 1.0.26-snapshot with better support for reference?

ranma42 commented 7 years ago

The latest master (d11d0f88bb032d4a3302f90ab3addeb1a6b0559b) seems to have the same problem.

wing328 commented 7 years ago

@ranma42 thanks for testing the latest master, may I suggest defining the map inline instead of a reference as a workaround?

ranma42 commented 7 years ago

I am already doing that for my project ;) I reported the issue because I was suggested to do so in the Swagger IRC channel (at first I was unsure if the spec was bad or it was just handled incorrectly).

wing328 commented 7 years ago

I am already doing that for my project ;)

👍

Looks like an issue that needs to be addressed in the Swagger Parser

ranma42 commented 7 years ago

@wing328 should I close this and report against https://github.com/swagger-api/swagger-parser ?

wing328 commented 7 years ago

@ranma42 yes please open an issue there as well.

thegecko commented 6 years ago

This still seems to be an issue in the 2.2.3 release.

baronfel commented 6 years ago

Same thing happens on the typescript-node templates on the latest release.

wing328 commented 6 years ago

cc @TiFu @taxpon @sebastianhaas @kenisteward

gordey4doronin commented 6 years ago

@ranma42 @wing328 Can I ask to clarify a bit how to make the workaround you mentioned.

I suggest defining the map inline instead of a reference as a workaround

But it's already inlined, not referenced. 👇

As the issue says, I have this input yaml:

  GenericMap:
    additionalProperties:
      type: integer

And I want to have a generated result like this:

export interface GenericMap {
  [key: string]: number;
}

But getting this instead:

export interface GenericMap extends null<String, number> { }
stefanmeschke commented 5 years ago

Any updates here? :)

naXa777 commented 4 years ago

@ranma42 did you report this issue in swagger-api/swagger-parser?

naXa777 commented 4 years ago

I found it myself https://github.com/swagger-api/swagger-parser/issues/401

sammy-da commented 2 years ago

Hello 👋 any updates on this?

alois-git commented 1 year ago

Same issue

threydor commented 1 month ago

Same issue