如何正确使用Drizzle的inferSelect与inferInsert?编译报错求助
问题分析与解决方案
错误原因
你代码里的两个问题本质都是类型不匹配:
- 第一行代码把查询结果(实体数组)错误赋值给了表Schema类型的变量:
typeof eyeSchema是表的定义对象类型(包含$inferSelect、$inferInsert等Schema属性),但db.query.eye.findMany()返回的是数据库中查询到的Eye实体数组,二者类型完全不兼容。
- 第二行
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
相关产品推荐
相关产品推荐

