【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