generated at
zod.discriminatedUnion()
Tagged Unionの定義
比較すべき箇所が明確になるのでzod.union()より高速らしい



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はどうやって書く?
これをやりたい.ts
type Z = X | Y // A | B | C | D type X = A | B type Y = C | D
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
zod.union()を使うしかないか
ts
const Z = z.union([x, y]); Z.parse({ type: 'a' }).type // いける



ワンチャン消えるらしい
実装に問題があり、これに関連して多くのissueが報告されている
代わりにzod.swtich()の導入の案あり