Closed
Description
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
Labels
No labels