From 6d3a1fe5b71fc83cd7f0034132d297317232ec0b Mon Sep 17 00:00:00 2001 From: Louis Bompart Date: Tue, 4 Aug 2026 12:40:23 +0200 Subject: [PATCH] feat(typescript-zod): preserve named object unions --- .../src/language/TypeScriptZod/language.ts | 4 ++++ test/unit/named-class-union.test.ts | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/quicktype-core/src/language/TypeScriptZod/language.ts b/packages/quicktype-core/src/language/TypeScriptZod/language.ts index 63b9abab51..0f99d4a974 100644 --- a/packages/quicktype-core/src/language/TypeScriptZod/language.ts +++ b/packages/quicktype-core/src/language/TypeScriptZod/language.ts @@ -51,6 +51,10 @@ export class TypeScriptZodTargetLanguage extends TargetLanguage< return true; } + public get supportsUnionsWithMultipleObjectTypes(): boolean { + return true; + } + protected makeRenderer( renderContext: RenderContext, untypedOptionValues: RendererOptions, diff --git a/test/unit/named-class-union.test.ts b/test/unit/named-class-union.test.ts index e9a7ba197d..c1b96e8b6f 100644 --- a/test/unit/named-class-union.test.ts +++ b/test/unit/named-class-union.test.ts @@ -67,7 +67,7 @@ function schemaWithReusedRef(): object { } async function generate( - lang: "python" | "typescript", + lang: "python" | "typescript" | "typescript-zod", operation: "oneOf" | "anyOf" = "oneOf", schema: object = schemaWithUnion(operation), ): Promise { @@ -114,6 +114,14 @@ describe("named class unions (issue #1646)", () => { expect(output).toContain("baz: Optional[str] = None"); }); + test("TypeScript Zod preserves the named alternatives", async () => { + const output = await generate("typescript-zod"); + + expect(output).toContain("export const FooSchema = z.object({"); + expect(output).toContain("export const BarSchema = z.object({"); + expect(output).toContain('"op": z.union([FooSchema, BarSchema])'); + }); + test("languages that do not opt in keep the existing behavior", async () => { const output = await generate("typescript");