はじめに
ZodでPrismaのEnumをスキーマとして利用しようとした際にz.enum()では出来なかったので、
少し調べてみました。
TL;DR
ZodのnativeEnumメソッドを使ってPrisma等のサードパーティーEnumをSchemaとして利用することができます。
PrismaのSchemaに任意のEnumを追加
prisma.schemaファイル上で任意のenumを以下のように定義します。
// prisma.schema
...
// Prismaのenum定義
enum Bar {
// 任意の値、この場合はいずれかの文字列のみ
ENUMA
ENUMB
}
ZodのSchemaファイルを作成
次に、以下のようにZodのSchemaファイルを作成します。
import { z } from 'zod'
import { Bar } from '@prisma/client' // Prisma clientからenumが型付きでインポートできる。
// z.nativeEnumを用いるとPrisma等のEnumを渡す事が出来ます。
export const FooEnumSchema = z.nativeEnum(Bar)
// 型生成
export type FooEnum = z.infer<typeof FooEnumSchema>
// 使用例
const FooSchema = z.object({
fooText: z.string(),
fooKey: FooEnumSchema // ここでPrismaのEnumをSchemaとして利用しています。
})
まとめ
以上、PrismaのEnumをZodのスキーマとして使う方法でした。
※ 今思えば、公式ドキュメントには普通に書いてあったので一次情報をすぐに見に行くべきでした。(反省)
参考文献