以前、OpenAPIスキーマからTypeScriptのクライアントを生成するために、 openapi-generator
を使いました。
- https://github.com/OpenAPITools/openapi-generator
- Rails + React + OpenAPI な環境で、クエリパラメータに配列を指定する時に調べたことをまとめてみた - メモ的な思考的な
そんな中、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
となっているところを、実行バージョンに変更します。
合わせて、出力先のディレクトリもバージョンに応じて変更するよう、 command
の 6_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