0Pricing
TypeScript Academy · 课时

类型安全的查询构建

构建能在编译时拒绝无效列的查询。

类型安全的查询构建 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

无法引用未知列的查询

类型安全的查询构建器会在编译时拒绝表中不存在的列名。您通过类型化对象引用列,而不是使用原始字符串。

类型化列引用

定义表后,每一列都是表对象上的一个属性。您应将这些属性而不是字符串传递给筛选器和选择操作。

import { eq } from "drizzle-orm";

// users.id and users.name are typed column objects
const rows = await db
  .select()
  .from(users)
  .where(eq(users.id, 1));

未知列等于编译错误

由于列是真实的属性,拼写错误会立即被捕获。不存在可以绕过类型检查的字符串形式入口。

await db.select().from(users).where(eq(users.idd, 1));
//                                          ^^^^ 
// Error: Property "idd" does not exist on the users table.

类型化比较操作数

像 eq 这样的运算符会针对列类型进行泛型化。将数字列与字符串进行比较会产生类型错误。

eq(users.age, 30);       // ok: age is number
eq(users.age, "thirty"); // Error: string is not assignable to number

选择特定列

传入一个值为列引用的对象,即可投影出一个子集。您选择的键会成为结果中的键。

const partial = await db
  .select({ id: users.id, name: users.name })
  .from(users);
// result rows: { id: number; name: string }[]

拒绝来自其他表的列

选择映射受到查询表的列限制。引用无关表中的列会导致编译失败。

await db
  .select({ title: posts.title }) // posts not in this query
  .from(users);
// Error: posts.title is not part of the FROM clause.

可组合的条件

条件可以通过 and、or 和 not 组合。每个部分都会保持类型安全,因此即使错误条件位于很深的树结构中,也能被捕获。

import { and, gt, eq } from "drizzle-orm";

const q = db.select().from(users).where(
  and(gt(users.age, 18), eq(users.isAdmin, false))
);

排序与限制数量

orderBy 同样接受类型化列引用,因此您无法按照表中不存在的列排序。

import { desc } from "drizzle-orm";

await db.select().from(users).orderBy(desc(users.age)).limit(10);

拒绝机制的工作原理

构建器针对表类型进行泛型化。where 和 select 的签名只接受 Column<TTable> 类型的值,因此编译器会根据结构拒绝其他任何值。

// Conceptual signature
declare function select<T>(
  table: T,
  cols: { [k: string]: ColumnOf<T> }
): Query;

插入同样具有类型约束

插入值会根据插入模型进行检查。缺少必需字段或值类型错误,都会在执行任何 SQL 之前成为编译错误。

await db.insert(users).values({
  name: "Ada",
  isAdmin: false,
  // missing fields would error; extra unknown keys error too
});

这有什么帮助

大多数对象关系映射器错误都源于重命名或类型错误的列,而这些问题只有在运行时才会被发现。类型安全的构建器会将它们变成编辑器中的红色波浪线,让您在部署之前很久就能发现问题。

快速检查

请确认您对类型安全查询构造的掌握程度。

回顾

类型安全的查询构造使用类型化列引用而不是字符串。未知列、错误的操作数类型,以及不在 FROM 子句中的表的列,都会变成编译错误。构建器针对表进行泛型化,因此类型系统会根据结构强制保证有效性。

常见问题解答

「类型安全的查询构建」课时是免费的吗?

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

「类型安全的查询构建」这节课中我会学到什么?

构建能在编译时拒绝无效列的查询。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

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

「类型安全的查询构建」课时需要多长时间?

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

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

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

此课程中的所有课时

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