Вывод структуры результата запроса
Позвольте конструктору запросов вывести тип возвращаемой строки
«Вывод структуры результата запроса» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Преобразование схемы в тип
- Типобезопасное построение запросов
- Вывод структуры результата запроса
- Связи и объединения с типами