Snippet
const schema_1 = z.object({
outputType: z.literal('hidden'),
consoleOutput: z.string(),
uploadedImageURL: z.string(),
})
const schema_2 = z.object({
outputType: z.literal('console'),
consoleOutput: z
.string({
invalid_type_error: 'コンソールのアウトプットは文字列のみ入力できます。',
required_error: 'コンソールのアウトプットを入力してください。',
})
.min(1, 'コンソールのアウトプットを入力してください。')
.max(500, 'コンソールのアウトプットは500文字まで入力できます。'),
uploadedImageURL: z.string(),
})
const schema_3 = z.object({
outputType: z.literal('image'),
consoleOutput: z.string(),
uploadedImageURL: z
.string({
invalid_type_error: '画像URLは文字列のみ入力できます。',
required_error: '画像は必須です。',
})
.min(1, '画像は必須です。')
.url('画像URLのURLの形式が正しくありません。'),
})
// discriminatedUnionの第一引数に条件分岐のもとになるキーを指定する
const outputSchema = z.discriminatedUnion('outputType', [
schema_1,
schema_2,
schema_3,
])