見出し画像

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);
};


参考スレです。


簡単ですが、以上です。


この記事が気に入ったらサポートをしてみませんか?