0Pricing
TypeScript Academy · Урок

Вывод структуры результата запроса

Позвольте конструктору запросов вывести тип возвращаемой строки

«Вывод структуры результата запроса» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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, эта характеристика сохраняется в результате. Выбор 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

Соединения расширяют структуру

При соединении тип результата получает ключи из присоединённой таблицы. Частичные выборки по нескольким соединённым таблицам по-прежнему сужаются точно. (Соединениям посвящён отдельный урок.)

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/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Вывод структуры результата запроса»?

Позвольте конструктору запросов вывести тип возвращаемой строки Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Вывод структуры результата запроса»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Преобразование схемы в тип
  2. Типобезопасное построение запросов
  3. Вывод структуры результата запроса
  4. Связи и объединения с типами
← Назад к TypeScript Academy