Zodの max
や min
を使用すると「𩸽」などのサロゲートペアの文字は2文字としてカウントされます。
以下のように min
を記述してフォームバリデーションをします。
const schema = z.object({
name: z
.string()
.min(2, "2文字以上で入力してください")
})
ユーザー名の入力欄には「𩸽」1文字しか入力されていないにも関わらず、「2文字以上で入力してください」というメッセージが表示されていません。
refine
を使用して以下のように書き換えます。
const schema = z.object({
name: z
.string()
.refine((value) => [...value].length > 2, {
message: '2文字以上で入力してください。',
}),
})
すると「𩸽」も1文字としてカウントされるようになり、「2文字以上で入力してください。」というエラーメッセージが表示されるようになります。