0Pricing
TypeScript Academy · 课时

推断查询结果结构

让查询构建器推断返回行的类型。

推断查询结果结构 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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.

重命名结果中的列

选择对象的键会成为结果中的键,因此您可以自由重命名,类型也会反映新的名称。

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 }[]

可空性会向下传递

如果您选择可空列,其可空性会保留在结果中。选择 age 会保留 number | null 类型。

const rows = await db.select({ age: users.age }).from(users);
// rows: { age: number | null }[]

推断类型的构建方式

结果类型是对选择对象应用映射类型得到的:每个值都是一个列,系统会读取其 data 类型(以及可空性),并将其映射到对应的键。

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 中手动选取键,就会失去数据库层面的收窄优势,并通过网络传输额外的列。请优先在查询时进行收窄。

快速检查

请确认您对推断结果形状的理解。

回顾

结果类型通过映射类型根据选择结果计算:完整选择返回整行,部分选择收窄到选定的键,重命名会更改结果键,可空性会向下传递,聚合函数会携带自己的类型。静态类型始终会镜像您实际编写的 SQL。

常见问题解答

「推断查询结果结构」课时是免费的吗?

是的 — 「推断查询结果结构」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「推断查询结果结构」这节课中我会学到什么?

让查询构建器推断返回行的类型。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「推断查询结果结构」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 从模式到类型的映射
  2. 类型安全的查询构建
  3. 推断查询结果结构
  4. 带类型的关系与连接
← 返回 TypeScript Academy