openapi-generatorのtypescript-axiosやtypescript-fetchで、OpenAPIスキーマのenumに対して生成されるTypeScriptコードが列挙型から変更になっていた

以前、OpenAPIスキーマからTypeScriptのクライアントを生成するために、 openapi-generator を使いました。

 
そんな中、OpenAPIスキーマenumに対して生成されるTypeScriptコードが、列挙型から変更になっていることに気づいたため、メモを残します。

 
目次

 

環境

今回はopenapi-generatorのうち、以下で試してみました。

  • openapi-generator-axios
  • openapi-generator-fetch

 
また、生成する時に使うOpenAPIスキーマは以下の通りです。

この中の Apple スキーマが、生成後のコードではどのように変わるかを見てみます。

openapi: 3.0.0
info:
  title: OpenAPI schema
  version: 0.0.1
servers:
  - url: http://localhost
components:
  schemas:
    Apple:
      type: object
      required:
        - color
      properties:
        color:
          type: integer
          enum:
            - 1
            - 2
          nullable: true
          x-enum-varnames:
            - Red
            - Yellow

paths:
  /apple:
    get:
      operationId: getApple
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Apple'

 
また、openapi-generatorはDockerを使ってTypeScriptクライアントを生成できることから、以下のようなdocker-compose.yamlを用意し試してみます。

なお、openapi-generatorのバージョンを変更するときは、imageで v6.3.0 となっているところを、実行バージョンに変更します。

合わせて、出力先のディレクトリもバージョンに応じて変更するよう、 command6_3_0 の部分を実行バージョンに変更します。

version: '3'
services:
  openapi_typescript_axios_6_3_0:
    image: openapitools/openapi-generator-cli:v6.3.0
    volumes:
      - ./:/local
    command: generate -i local/openapi.yaml -g typescript-axios -o local/axios/6_3_0

 

typescript-axiosの場合

5.4.0 を境に、列挙型からリテラル + ユニオン型になっていました。

5.3.1

docker compose run --rm openapi_typescript_axios_5_3_1

を実行すると、以下が axios/5_3_1/api.ts に出力されました。

export enum AppleColorEnum {
    Red = 1,
    Yellow = 2
}

5.4.0

docker compose run --rm openapi_typescript_axios_5_4_0

を実行すると、以下が axios/5_4_0/api.ts に出力されました。

export const AppleColorEnum = {
    Red: 1,
    Yellow: 2
} as const;

export type AppleColorEnum = typeof AppleColorEnum[keyof typeof AppleColorEnum];

 

typescript-fetchの場合

6.0.0 を境に、列挙型からリテラル + ユニオン型になっていました。

5.4.0

docker compose run --rm openapi_typescript_fetch_5_4_0

を実行すると、以下が fetch/5_4_0/models/Apple.ts に出力されました。

export enum AppleColorEnum {
    Red = 1,
    Yellow = 2
}

 

6.0.0

docker compose run --rm openapi_typescript_fetch_6_0_0

を実行すると、以下が fetch/6_0_0/models/Apple.ts に出力されました。

export const AppleColorEnum = {
    Red: 1,
    Yellow: 2
} as const;
export type AppleColorEnum = typeof AppleColorEnum[keyof typeof AppleColorEnum];

 

ソースコード

Githubに上げました。
https://github.com/thinkAmi-sandbox/openapi_generator_typescript_enum-sample

 
プルリクはこちら。
https://github.com/thinkAmi-sandbox/openapi_generator_typescript_enum-sample/pull/1