0Pricing
TypeScript Academy · レッスン

クエリ結果の形状推論

クエリビルダーに返される行の型を推論させます。

「クエリ結果の形状推論」は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 } | undefined

JOINで形が拡張される

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スキーマから型へのマッピング
  2. 型安全なクエリ構築
  3. クエリ結果の形状推論
  4. 型によるリレーションとJOIN
← TypeScript Academyに戻る