zod.discriminatedUnion()
Tagged Unionの定義
比較すべき箇所が明確になるのでzod.union()より高速らしい
docs
例
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
zod.union()を使うしかないか
code:ts
const Z = z.union(x, y);
Z.parse({ type: 'a' }).type // いける
Deprecating z.discriminatedUnion ? · Issue #2106 · colinhacks/zod · GitHub
ワンチャン消えるらしい
実装に問題があり、これに関連して多くのissueが報告されている
代わりにzod.swtich()の導入の案あり