【Drizzle】withやcolumnを反映した型を使う

こんにちは、フリーランスエンジニアの太田雅昭です。

Drizzleでの型

DrizzleはTypeScriptに対応しています。ただ比較的新しいライブラリのためか、型が若干弱いです。Prismaなら簡単に作れる型でも、Drizzleだと苦労すると言った場面も。

withやcolumnを反映させる

withやcolumnを反映させた型を使うには、独自に設定する必要があります。下記のようなユーティリティー型を作り、実現します。

import type * as schema from './schema'
import type { BuildQueryResult, DBQueryConfig, ExtractTablesWithRelations } from 'drizzle-orm'
import type { Exact } from 'type-fest'

type TSchema = ExtractTablesWithRelations<typeof schema>

type QueryConfig<TableName extends keyof TSchema> = DBQueryConfig<
  'one' | 'many',
  boolean,
  TSchema,
  TSchema[TableName]
>

export type InferQueryModel<
  TableName extends keyof TSchema,
  QBConfig extends Exact<QueryConfig<TableName>, QBConfig> = {}
> = BuildQueryResult<TSchema, TSchema[TableName], QBConfig>

なおtype-festを使用しているため、インストールしてください

npm i -D type-fest

使用する際は、InferQueryModelを使います。

type UserNameWithPostTitles = InferQueryModel<'users', {
  columns: {
    id: true,
    name: true
  },
  with: {
    posts: {
      columns: {
        id: true,
        title: true
      }
    }
  }
}>;

下記を参考にさせていただきました。というより、URLをChatGPTに丸投げでした。はい。かしこい人には頭が上がりません。

https://github.com/drizzle-team/drizzle-orm/issues/695#issuecomment-1881454650