Prisma の型についてメモ

Generated Type
Generated types are TypeScript types that are derived from your models. You can use them to create typed objects that you pass into top-level methods like prisma.user.create(...) or prisma.user.update(...), or options such as select or include.
prisma client の method の引数に渡す、Model 由来の諸々の型
- select で渡すデータの型
- createMany で渡す
data
の型
などなど

どこから使える?
@prisma/client
の Prisma
namespace に生成された型が生えている
import { Prisma } from '@prisma/client'
// Build 'select' object
const userEmail: Prisma.UserSelect = {
email: true,
}
// Use select object
const createUser = await prisma.user.create({
data: {
email: 'bob@prisma.io',
},
select: userEmail,
})


enum の型について
enum Role {
USER
ADMIN
}
以下のような型が生成される↓
export const Role: {
USER: 'USER',
ADMIN: 'ADMIN',
};
export type Role = (typeof Role)[keyof typeof Role]
import { Role } from '@prisma/client';

zod で利用
z.nativeEnum()
にそのまま渡せる
import { Role } from '@prisma/client';
const roleSchema = z.nativeEnum(Role);

Prisma Client extensions で拡張した model の型を使いたい
Prisma Client extensions はこちらを参照↓

Prisma type-utilities の Result を使えばいける
Prisma.Result
を活用して、取得したい型の model を指定すればOK。
import { prisma } from '@/lib/prisma';
import type { Prisma, PrismaClient } from '@prisma/client'
const extendedPrismaClient = prisma.$extends({
name: 'UserExtension',
result: {
user: {
extendedField: {
compute(user) {
//...
return '';
},
},
},
},
});
type ExtendedUser = Prisma.Result<
(typeof extendedPrismaClient)['user'],
unknown,
'findUniqueOrThrow'
>;

Prisma Client extensions で拡張した model の select の型を使いたい
こんな感じで↓ extension で拡張した model の select の型を satisfies で使いたい。
const myUserSelect = {
//...
} satisfies ExtendedUserSelect;

Prisma type-utilities の Args を使う
Prisma.Args
で extension 利用時の operation の引数の型を習得できるので、そこから select を引っ張ってくればOK。
Args<Type, Operation>: Retrieves the input arguments for any given model and operation. This is particularly useful for extension authors who want to do the following:
- Re-use existing types to extend or modify them.
- Benefit from the same auto-completion experience as on existing operations.
import { prisma } from '@/lib/prisma';
import type { Prisma, PrismaClient } from '@prisma/client'
const extendedPrismaClient = prisma.$extends({
name: 'UserExtension',
result: {
user: {
extendedField: {
compute(user) {
//...
return '';
},
},
},
},
});
type ExtendedUserArgs = Prisma.Args<
(typeof extendedPrismaClient)['user'],
'findUnique'
>;
type ExtendedUserSelect = ExtendedUserArgs['select']