zod.discriminatedUnion()
例
code:ts
const myUnion = z.discriminatedUnion("status", [
z.object({ status: z.literal("success"), data: z.string() }),
z.object({ status: z.literal("failed"), error: z.instanceof(Error) }),
]);
myUnion.parse({ status: "success", data: "yippie ki yay" });
discriminatedUnion同士のunionはどうやって書く?
code:これをやりたい.ts
type Z = X | Y // A | B | C | D
type X = A | B
type Y = C | D
code:ts
const x = z.discriminatedUnion('type', [
z.object({ type: z.literal('a') }),
z.object({ type: z.literal('b') }),
]);
const y = z.discriminatedUnion('type', [
z.object({ type: z.literal('c') }),
z.object({ type: z.literal('d') }),
]);
const Z = z.discriminatedUnion('type', x, y); // error code:ts
Z.parse({ type: 'a' }).type // いける
ワンチャン消えるらしい
実装に問題があり、これに関連して多くのissueが報告されている