You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用Drizzle的inferSelect与inferInsert?编译报错求助

问题分析与解决方案

错误原因

你代码里的两个问题本质都是类型不匹配:

  1. 第一行代码把查询结果(实体数组)错误赋值给了表Schema类型的变量:
    • typeof eyeSchema是表的定义对象类型(包含$inferSelect、$inferInsert等Schema属性),但db.query.eye.findMany()返回的是数据库中查询到的Eye实体数组,二者类型完全不兼容。
  2. 第二行db.select().from(eyeSchema)类型推断为{[x:string]:unknown}[],是因为Drizzle在未指定具体查询字段时,默认类型推断不够精确,或是项目缺少Drizzle类型生成的配置支持。

修正后的代码

import {pgTable, varchar} from 'drizzle-orm/pg-core';
import {defaults} from "../../db/schema/defaults";

export const eyeSchema = pgTable('eye', {
    id: defaults.id,
    value: varchar('value', { length: 256 }).notNull(),
});

export type Eye = typeof eyeSchema.$inferSelect; // 查询返回的单实体类型
export type NewEye = typeof eyeSchema.$inferInsert; // 插入用的类型

// 修正:用Eye[]类型接收findMany的结果
const a: Eye[] = await db.query.eye.findMany();

// 方案1:用db.query语法(推荐),自动推断精确类型
const b = await db.query.eye.findMany();

// 方案2:显式指定查询字段,让类型推断更精确
const c = await db.select({
  id: eyeSchema.id,
  value: eyeSchema.value,
}).from(eyeSchema);

// 方案3:手动指定返回类型
const d: Eye[] = await db.select().from(eyeSchema);

额外建议

  • 优先使用db.query.<表名>.findMany()/findFirst()等API,Drizzle会自动基于Schema推断出精确的返回类型,无需手动指定。
  • 若使用db.select()语法,建议显式列出要查询的字段,既可以优化SQL性能,也能让TypeScript获得精准的类型推断。
  • 确保项目已正确配置Drizzle类型生成(如PostgreSQL/SQLite场景下,运行drizzle-kit generate生成类型文件),帮助TypeScript更好地识别数据库结构。

内容的提问来源于stack exchange,提问作者juli1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:06:07