見出し画像

ドメインにおけるモデルとしての型定義とデータとしての型定義を区別した考え方について

こんにちわ。nap5です。

ドメインにおけるモデルとしての型定義とデータとしての型定義を区別した考え方について紹介したいと思います。


以前の記事と関連です。


ドメインとしてUserを取り上げます。

モデルとしての型定義

まずはモデルとしての型定義です。Partialも用意しておくとハンディです。

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()


データとしての型定義

nullishでnullとundefinedをリラックスさせておきます。多くのデータベースでの初期値はnullでデータがないことを定義しています。

import { z } from 'zod'

const UserDataSchema = UserSchema.nullish()
const UsersDataSchema = UserSchema.nullish().array().nullish()
const UserPartialDataSchema = UserSchema.deepPartial().nullish()
const UsersPartialDataSchema = UserSchema.deepPartial().array().nullish()


最後にinferで型を起こしておしまいです。

import { z } from 'zod'

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>


これらの型を使いながらneatValueを作るsafeParseを用意しておくといい感じになっていきます。


簡単ですが、以上です。


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