Drizzle ORM+TypeScript在VS Code中无法识别Schema的问题
迁移Drizzle ORM到TypeScript后Schema无法识别的问题及解决
问题详情
将Drizzle ORM从JavaScript迁移到TypeScript后,遇到数据库Schema无法被TypeScript正确识别的问题:
- 查询数据库时触发TS错误:
Property 'users' does not exist on type '{}'.ts - 赋值
drizzle实例到db时触发TS错误:Type 'DbQuery' is not assignable to type 'NodePgDatabase<Record<string, unknown>> & { $client: NodePgClient; }'. Type 'DbQuery'缺少NodePgDatabase的_, query等属性
数据库连接代码
import * as schema from "../core/models/index"; import { Pool } from "pg"; import { drizzle } from "drizzle-orm/node-postgres"; import { environmentVar } from "./env"; class DatabaseConnection { private static instance: DatabaseConnection | null = null; private pool!: Pool; private db: ReturnType<typeof drizzle> | null = null; constructor() { if (DatabaseConnection.instance) { return DatabaseConnection.instance; } if (!environmentVar.DATABASE_URL) { throw new Error("DATABASE_URL is not defined in the environment."); } this.pool = new Pool({ connectionString: environmentVar.DATABASE_URL, max: 20, idleTimeoutMillis: 60000 * 5, connectionTimeoutMillis: 5000, }); DatabaseConnection.instance = this; } getConnection() { if (!this.db) { this.db = drizzle(this.pool, { schema }); } return this.db; } async close() { if (this.pool) { await this.pool.end(); console.log("Database pool closed."); } } } const dbInstance = new DatabaseConnection(); export const db = dbInstance.getConnection();
查询代码
import { db } from "../../config/database"; import { eq } from "drizzle-orm"; import { users } from "../core/models/index"; async function findUserByPhoneNumber(phoneNumber: string) { const user = await db.query.users.findFirst({ where: eq(users.phoneNumber, phoneNumber), }); return user; }
已尝试的操作
- ✅ 确认Schema已从
../core/models/index.ts正确导出 - ✅ 执行
console.log(db.query)返回["userStatus", "users"],Schema实际存在 - ✅ 手动从Schema文件导入
users而非依赖db.query.users - ✅ 将
database.ts改为JavaScript文件可正常运行,但希望保留TypeScript - ✅ 检查
tsconfig.json已开启strict模式 - ✅ 尝试用
as any临时规避,但非合理方案
疑问
- 为何代码可运行但TypeScript无法识别Schema并报错?
- 如何修复以在VS Code中获得
db.query.users的TypeScript自动补全? - 是否有正确定义
db的方式让Drizzle ORM正确推断Schema类型?
注:项目全为JavaScript时可正常运行,VS Code自动补全也正常。
解决方案
问题根源
TypeScript无法识别Schema,是因为你用ReturnType<typeof drizzle>定义db类型时,没有绑定自定义Schema的结构,导致TS无法推断query对象下的表和字段信息。
具体修复步骤
- 导入专用类型:从
drizzle-orm/node-postgres导入NodePgDatabase类型 - 绑定Schema到类型:将
db的类型定义为NodePgDatabase<typeof schema>,替代ReturnType<typeof drizzle> - 确保Schema正确导出:
../core/models/index.ts需导出所有表的Schema对象,示例:// ../core/models/index.ts export { users } from "./users"; export { userStatus } from "./userStatus";
修改后的核心代码片段
// 新增导入NodePgDatabase类型 import { drizzle, NodePgDatabase } from "drizzle-orm/node-postgres"; class DatabaseConnection { // 绑定Schema到NodePgDatabase类型 private db: NodePgDatabase<typeof schema> | null = null; // ...其余代码不变 getConnection() { if (!this.db) { // drizzle会自动匹配类型,无需额外断言 this.db = drizzle(this.pool, { schema }); } return this.db; } }
额外检查项
- 确保
tsconfig.json配置了兼容的TypeScript版本(建议4.9+),并开启关键选项:{ "compilerOptions": { "strict": true, "module": "ESNext", "target": "ES2020", "moduleResolution": "node", "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true } } - 若使用Drizzle Kit生成Schema,确认生成的类型文件已被正确导入并被TS识别。
内容的提问来源于stack exchange,提问作者UNRIVALLEDKING
相关产品推荐
相关产品推荐

