8000 v4: `z.interface` cyclical reference with `z.discriminatedUnion` · Issue #4245 · colinhacks/zod · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
v4: z.interface cyclical reference with z.discriminatedUnion #4245
Closed
@riywo

Description

@riywo

I've just tried v4 and realized an edge case for the new cyclical reference style. Here is the code snippet:

import * as z from "zod"; // zod@4

const StepA = z.interface({
  name: z.literal("stepA"),
  get subSteps() {
    return z.array(Step);
  },
});

const StepB = z.interface({
  name: z.literal("stepB"),
  get subSteps() {
    return z.array(Step);
  },
});

const Step = z.discriminatedUnion([StepA, StepB]);

TypeScript has no complaining and z.infer also looks working well.

However, when I run this script:

> npx tsx .\index.ts
C:\Users\riywo\tmp\zod\index.ts:6
    return z.array(Step);
                   ^


ReferenceError: Cannot access 'Step' before initialization
    at Object.get subSteps (C:\Users\riywo\tmp\zod\index.ts:6:20)
    at Function.entries (<anonymous>)
    at Object.cleanInterfaceShape (C:\Users\riywo\tmp\zod\node_modules\@zod\core\dist\commonjs\util.js:332:39)
    at C:\Users\riywo\tmp\zod\node_modules\zod\dist\commonjs\schemas.js:614:58
    at get value (C:\Users\riywo\tmp\zod\node_modules\@zod\core\dist\commonjs\util.js:83:31)
    at get shape (C:\Users\riywo\tmp\zod\node_modules\zod\dist\commonjs\schemas.js:619:36)
    at C:\Users\riywo\tmp\zod\node_modules\@zod\core\dist\commonjs\schemas.js:635:27
    at Object.get (C:\Users\riywo\tmp\zod\node_modules\@zod\core\dist\commonjs\util.js:112:31)
    at C:\Users\riywo\tmp\zod\node_modules\@zod\core\dist\commonjs\schemas.js:965:22
    at $ZodDiscriminatedUnion.init (C:\Users\riywo\tmp\zod\node_modules\@zod\core\dist\commonjs\core.js:23:13)

Node.js v22.12.0

It

Is there any workaround to apply the new z.interface for this use case?

FYI: package versions

{
  "dependencies": {
    "tsx": "^4.19.3",
    "zod": "^4.0.0-beta.20250420T053007"
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0