zodライブラリのsafeParseメソッドを使ったneatValueの作り方
こんにちわ。nap5です。
zodライブラリのsafeParseメソッドを使ったneatValueの作り方を紹介したいと思います。
以下がデモになります。
import { z } from 'zod'
const UserSchema = z.object({
id: z.number(),
name: z.string(),
})
const UsersSchema = UserSchema.array()
const UserPartialSchema = UserSchema.deepPartial()
const UsersPartialSchema = UserSchema.deepPartial().array()
const UserDataSchema = UserSchema.nullish()
const UsersDataSchema = UserSchema.nullish().array().nullish()
const UserPartialDataSchema = UserSchema.deepPartial().nullish()
const UsersPartialDataSchema = UserSchema.deepPartial().array().nullish()
type User = z.infer<typeof UserSchema>
type Users = z.infer<typeof UsersSchema>
type UserPartial = z.infer<typeof UserPartialSchema>
type UsersPartial = z.infer<typeof UsersPartialSchema>
type UserData = z.infer<typeof UserDataSchema>
type UsersData = z.infer<typeof UsersDataSchema>
type UserPartialData = z.infer<typeof UserPartialDataSchema>
type UsersPartialData = z.infer<typeof UsersPartialDataSchema>
const safeParseUsersData = (data: unknown) => {
// https://stackoverflow.com/a/73994446/15972569
const dataArr = z.array(z.unknown()).parse(data)
return dataArr
.map((datum) => {
const parsed = UserPartialDataSchema.safeParse(datum)
return parsed.success ? parsed.data : null
})
.filter((x: UserPartialData): x is User => x !== null)
}
const demo = [
{
id: 1,
name: 'user1',
},
{
id: 2,
name: 'user2',
},
{
id: 3,
name: 'user3',
},
]
const parsedData = safeParseUsersData(demo)
console.log(`parsedData`, parsedData)
以下の部分がポイントでPartialなスキーマでリラックスさせておくと、ハンディでいいと思います。Partialでないスキーマでneatすると空配列が返ってくることがあります。ケースによって使い分けてもいいかもです。
const safeParseUsersData = (data: unknown) => {
// https://stackoverflow.com/a/73994446/15972569
const dataArr = z.array(z.unknown()).parse(data);
return dataArr
.map((datum) => {
const parsed = UserPartialDataSchema.safeParse(datum);
return parsed.success ? parsed.data : null;
})
.filter((x: UserPartialData): x is User => x !== null);
};
参考スレです。
簡単ですが、以上です。
この記事が気に入ったらサポートをしてみませんか?