zod.discriminatedUnion()
例
tsconst 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はどうやって書く?
これをやりたい.tstype Z = X | Y // A | B | C | D
type X = A | B
type Y = C | D
tsconst 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
tsconst Z = z.union([x, y]);
Z.parse({ type: 'a' }).type // いける
ワンチャン消えるらしい
実装に問題があり、これに関連して多くのissueが報告されている