From 9818905f7a7724485cdeea8d040a70d8bdd34220 Mon Sep 17 00:00:00 2001 From: Kui-kui Date: Wed, 12 Nov 2025 17:16:14 +0100 Subject: [PATCH] fix(enum): handle nullable enum when useEnums=true --- .../src/core/schemaToTypeAliasDeclaration.ts | 5 ++++- plugins/typescript/src/fixtures/petstore.ts | 14 ++++++++++-- .../generators/generateSchemaTypes.test.ts | 22 +++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/plugins/typescript/src/core/schemaToTypeAliasDeclaration.ts b/plugins/typescript/src/core/schemaToTypeAliasDeclaration.ts index 1d9b4a10..e59a21c5 100644 --- a/plugins/typescript/src/core/schemaToTypeAliasDeclaration.ts +++ b/plugins/typescript/src/core/schemaToTypeAliasDeclaration.ts @@ -173,7 +173,10 @@ export const getType = ( if (schema.enum) { if (isNodeEnum) { - return f.createTypeReferenceNode(f.createIdentifier(pascal(name || ""))); + return f.createUnionTypeNode([ + f.createTypeReferenceNode(f.createIdentifier(pascal(name || ""))), + ...(schema.nullable ? [f.createLiteralTypeNode(f.createNull())] : []), + ]); } const unionTypes = f.createUnionTypeNode([ diff --git a/plugins/typescript/src/fixtures/petstore.ts b/plugins/typescript/src/fixtures/petstore.ts index dee08367..c9f9af14 100644 --- a/plugins/typescript/src/fixtures/petstore.ts +++ b/plugins/typescript/src/fixtures/petstore.ts @@ -364,8 +364,13 @@ export const petstore: OpenAPIObject = { type: "string", enum: ["labrador", "carlin", "beagle"], }, + temperament: { + type: "string", + enum: ["calm", "playful", "aggressive", "shy"], + nullable: true, + }, }, - required: ["type", "breed"], + required: ["type", "breed", "temperament"], }, Dog: { description: "A dog, wooof.", @@ -378,8 +383,13 @@ export const petstore: OpenAPIObject = { type: "string", enum: ["saimois", "bengal", "british shorthair"], }, + temperament: { + type: "string", + enum: ["calm", "playful", "aggressive", "shy"], + nullable: true, + }, }, - required: ["type", "breed"], + required: ["type", "breed", "temperament"], }, Error: { description: "An error :(", diff --git a/plugins/typescript/src/generators/generateSchemaTypes.test.ts b/plugins/typescript/src/generators/generateSchemaTypes.test.ts index 5bf29a6a..23c10120 100644 --- a/plugins/typescript/src/generators/generateSchemaTypes.test.ts +++ b/plugins/typescript/src/generators/generateSchemaTypes.test.ts @@ -175,6 +175,7 @@ describe("generateSchemaTypes", () => { export type Cat = { type: string; breed: "labrador" | "carlin" | "beagle"; + temperament: "calm" | "playful" | "aggressive" | "shy" | null; }; /** @@ -183,6 +184,7 @@ describe("generateSchemaTypes", () => { export type Dog = { type: string; breed: "saimois" | "bengal" | "british shorthair"; + temperament: "calm" | "playful" | "aggressive" | "shy" | null; }; /** @@ -233,13 +235,27 @@ describe("generateSchemaTypes", () => { Carlin = "carlin", Beagle = "beagle", } - + + export enum CatTemperament { + Calm = "calm", + Playful = "playful", + Aggressive = "aggressive", + Shy = "shy", + } + export enum DogBreed { Saimois = "saimois", Bengal = "bengal", BritishShorthair = "british shorthair", } - + + export enum DogTemperament { + Calm = "calm", + Playful = "playful", + Aggressive = "aggressive", + Shy = "shy", + } + /** * A new pet. */ @@ -275,6 +291,7 @@ describe("generateSchemaTypes", () => { export type Cat = { type: string; breed: CatBreed; + temperament: CatTemperament | null; }; /** @@ -283,6 +300,7 @@ describe("generateSchemaTypes", () => { export type Dog = { type: string; breed: DogBreed; + temperament: DogTemperament | null; }; /**