クエリ結果の形状推論
クエリビルダーに返される行の型を推論させます。
「クエリ結果の形状推論」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。
結果の型は選択内容に従う
優れたクエリビルダーは入力を検証するだけでなく、選択したカラムから各結果行の正確な形を推論します。選択するカラムを減らせば、結果の型も絞り込まれます。
行全体の選択
射影を指定せずに select() を呼び出すと、行全体の型が返されます。
const rows = await db.select().from(users);
// rows: { id: number; name: string; age: number | null; isAdmin: boolean }[]部分選択で型を絞り込む
必要なカラムだけを射影すると、結果の型にはそのキーだけが含まれます。
const rows = await db
.select({ id: users.id, name: users.name })
.from(users);
// rows: { id: number; name: string }[]
// Accessing rows[0].age is a compile error.結果内でのカラム名の変更
selectオブジェクトのキーが結果のキーになるため、自由に名前を変更でき、型にも新しい名前が反映されます。
const rows = await db
.select({ userId: users.id, fullName: users.name })
.from(users);
// rows: { userId: number; fullName: string }[]計算カラムと集約カラム
集約関数は、それぞれの推論された型を持ちます。count() は数値を返し、エイリアスのキーが結果内でその名前になります。
import { count } from "drizzle-orm";
const rows = await db
.select({ total: count() })
.from(users);
// rows: { total: number }[]null許容性も引き継がれる
null許容カラムを選択すると、そのnull許容性も結果に維持されます。age を選択すると、number | null 型が保たれます。
const rows = await db.select({ age: users.age }).from(users);
// rows: { age: number | null }[]型推論の構築方法
結果の型はselectオブジェクトに対するマップ型です。各値はカラムであり、その data 型とnull許容性が読み取られて、対応するキーに反映されます。
type InferSelect<S> = {
[K in keyof S]: S[K] extends Column<infer D, infer Null>
? Null extends true ? D | null : D
: never;
};単一行用ヘルパー
ビルダーによっては、.get() や [0] によるアクセスを提供しています。要素の型は同じ選択内容から導出され、配列から取り出された形になります。
const one = (await db.select({ id: users.id }).from(users))[0];
// one: { id: number } | undefinedJOINで形が拡張される
JOINすると、結果の型に結合先テーブルのキーが加わります。結合されたテーブルに対する部分選択でも、結果の型は正確に絞り込まれます。(JOINについては別のレッスンで扱います。)
const rows = await db
.select({ name: users.name, title: posts.title })
.from(users)
.innerJoin(posts, eq(posts.authorId, users.id));
// rows: { name: string; title: string }[]絞り込みが重要な理由
選択したキーだけを返すことで、取得していないカラムに誤って依存することを防げます。型は実際のSQLを反映するため、過剰取得や取得不足のバグがエディター上で明らかになります。
落とし穴: 展開してから選択する
行全体を取得してからJSで手動でキーを選ぶと、データベースレベルで型を絞り込む利点が失われ、余分なカラムまでネットワーク経由で送ることになります。クエリの段階で絞り込むようにしてください。
理解度チェック
推論される結果の形について、理解度を確認しましょう。
まとめ
結果の型は、マップ型によって選択内容から計算されます。全体選択では行全体が返され、部分選択では選択したキーに絞り込まれます。名前を変更すれば結果のキーも変わり、null許容性は引き継がれ、集約関数はそれぞれの型を持ちます。静的な型は常に、実際に記述したSQLを反映します。
よくある質問
「クエリ結果の形状推論」レッスンは無料ですか?
はい。「クエリ結果の形状推論」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。
「クエリ結果の形状推論」で何を学びますか?
クエリビルダーに返される行の型を推論させます。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「クエリ結果の形状推論」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スキーマから型へのマッピング
- 型安全なクエリ構築
- クエリ結果の形状推論
- 型によるリレーションとJOIN