Open11

Prisma の型についてメモ

nbstshnbstsh

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 の型

などなど

nbstshnbstsh

どこから使える?

@prisma/clientPrisma 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,
})
nbstshnbstsh
nbstshnbstsh

enum の型について

schema.prisma
enum Role {
  USER
  ADMIN
}

以下のような型が生成される↓

.prisma/client/index.d.ts
export const Role: {
  USER: 'USER',
  ADMIN: 'ADMIN',
};

export type Role = (typeof Role)[keyof typeof Role]
import { Role } from '@prisma/client';
nbstshnbstsh

zod で利用

z.nativeEnum() にそのまま渡せる

import { Role } from '@prisma/client';

const roleSchema = z.nativeEnum(Role);

nbstshnbstsh

Prisma Client extensions で拡張した model の型を使いたい

Prisma Client extensions はこちらを参照↓

https://www.prisma.io/docs/orm/prisma-client/client-extensions

nbstshnbstsh

Prisma type-utilities の Result を使えばいける

Prisma.Result を活用して、取得したい型の model を指定すればOK。

https://www.prisma.io/docs/orm/prisma-client/type-safety#type-utilities

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'
>;
nbstshnbstsh

Prisma Client extensions で拡張した model の select の型を使いたい

こんな感じで↓ extension で拡張した model の select の型を satisfies で使いたい。

const myUserSelect = {
  //...
} satisfies ExtendedUserSelect;
nbstshnbstsh

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.

https://www.prisma.io/docs/orm/prisma-client/type-safety#type-utilities

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']