Skip to content

Commit 6407bed

Browse files
authoredDec 10, 2024··
Allow creation of discriminated unions with a readonly array of options (#3535)
Signed-off-by: Andrew Haines <andrew@haines.org.nz>
1 parent b85686a commit 6407bed

File tree

4 files changed

+28
-6
lines changed

4 files changed

+28
-6
lines changed
 

‎deno/lib/__tests__/discriminated-unions.test.ts

+11
Original file line numberDiff line numberDiff line change
@@ -308,3 +308,14 @@ test("optional and nullable", () => {
308308
if (value.key === "b") value.b;
309309
if (value.key === null) value.b;
310310
});
311+
312+
test("readonly array of options", () => {
313+
const options = [
314+
z.object({ type: z.literal("x"), val: z.literal(1) }),
315+
z.object({ type: z.literal("y"), val: z.literal(2) }),
316+
] as const;
317+
318+
expect(
319+
z.discriminatedUnion("type", options).parse({ type: "x", val: 1 })
320+
).toEqual({ type: "x", val: 1 });
321+
});

‎deno/lib/types.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3165,7 +3165,7 @@ export type ZodDiscriminatedUnionOption<Discriminator extends string> =
31653165

31663166
export interface ZodDiscriminatedUnionDef<
31673167
Discriminator extends string,
3168-
Options extends ZodDiscriminatedUnionOption<string>[] = ZodDiscriminatedUnionOption<string>[]
3168+
Options extends readonly ZodDiscriminatedUnionOption<string>[] = ZodDiscriminatedUnionOption<string>[]
31693169
> extends ZodTypeDef {
31703170
discriminator: Discriminator;
31713171
options: Options;
@@ -3175,7 +3175,7 @@ export interface ZodDiscriminatedUnionDef<
31753175

31763176
export class ZodDiscriminatedUnion<
31773177
Discriminator extends string,
3178-
Options extends ZodDiscriminatedUnionOption<Discriminator>[]
3178+
Options extends readonly ZodDiscriminatedUnionOption<Discriminator>[]
31793179
> extends ZodType<
31803180
output<Options[number]>,
31813181
ZodDiscriminatedUnionDef<Discriminator, Options>,
@@ -3245,7 +3245,7 @@ export class ZodDiscriminatedUnion<
32453245
*/
32463246
static create<
32473247
Discriminator extends string,
3248-
Types extends [
3248+
Types extends readonly [
32493249
ZodDiscriminatedUnionOption<Discriminator>,
32503250
...ZodDiscriminatedUnionOption<Discriminator>[]
32513251
]

‎src/__tests__/discriminated-unions.test.ts

+11
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,14 @@ test("optional and nullable", () => {
307307
if (value.key === "b") value.b;
308308
if (value.key === null) value.b;
309309
});
310+
311+
test("readonly array of options", () => {
312+
const options = [
313+
z.object({ type: z.literal("x"), val: z.literal(1) }),
314+
z.object({ type: z.literal("y"), val: z.literal(2) }),
315+
] as const;
316+
317+
expect(
318+
z.discriminatedUnion("type", options).parse({ type: "x", val: 1 })
319+
).toEqual({ type: "x", val: 1 });
320+
});

‎src/types.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3165,7 +3165,7 @@ export type ZodDiscriminatedUnionOption<Discriminator extends string> =
31653165

31663166
export interface ZodDiscriminatedUnionDef<
31673167
Discriminator extends string,
3168-
Options extends ZodDiscriminatedUnionOption<string>[] = ZodDiscriminatedUnionOption<string>[]
3168+
Options extends readonly ZodDiscriminatedUnionOption<string>[] = ZodDiscriminatedUnionOption<string>[]
31693169
> extends ZodTypeDef {
31703170
discriminator: Discriminator;
31713171
options: Options;
@@ -3175,7 +3175,7 @@ export interface ZodDiscriminatedUnionDef<
31753175

31763176
export class ZodDiscriminatedUnion<
31773177
Discriminator extends string,
3178-
Options extends ZodDiscriminatedUnionOption<Discriminator>[]
3178+
Options extends readonly ZodDiscriminatedUnionOption<Discriminator>[]
31793179
> extends ZodType<
31803180
output<Options[number]>,
31813181
ZodDiscriminatedUnionDef<Discriminator, Options>,
@@ -3245,7 +3245,7 @@ export class ZodDiscriminatedUnion<
32453245
*/
32463246
static create<
32473247
Discriminator extends string,
3248-
Types extends [
3248+
Types extends readonly [
32493249
ZodDiscriminatedUnionOption<Discriminator>,
32503250
...ZodDiscriminatedUnionOption<Discriminator>[]
32513251
]

0 commit comments

Comments
 (0)
Please sign in to comment.