返回首页

dirzzle

分类:elysia
发布于:
阅读时间:19 分钟

alt text

这是删除返回的对象

  1. ​Drizzle 的表定义:不要叫 schema,而叫 table

✅ 一、你当前的规范总结(非常棒的基础!)

用途命名方式后缀/风格示例说明
Drizzle 表定义xxxTable驼峰usersTable表示数据库表,语义清晰,区别于 Zod
Zod 校验规则(运行时校验)xxxSchema驼峰selectuserTableinsertuserTable用于请求/返回校验,不与 Drizzle 混淆
Zod 推断出的类型(返回类型)SelectUserType大驼峰SelectUserType如果没有多表联查,可加 Vo 后缀,如 SelectUserVo,作为返回给前端的类型
返回给前端的类型(查询结果)SelectUserVoVo 后缀 + 大驼峰SelectUserVo表示“视图对象”,适合表格、页面展示,推荐加 Vo
前端请求用的类型(插入/更新)InsertUserDto / UpdateUserDtoDto 后缀 + 大驼峰InsertUserDto提供给前端用于提交数据的类型,语义明确
类型命名风格---Zod 推断类型默认用 type SelectUserType = z.infer<...>,但你可以手动再包装一层,命名为大驼峰,如 SelectUserVo

🧩 三、我可以为你进一步完善与补充这个规范,让它更严谨、更通用、更可扩展

✅ 【1】命名规范补充与统一建议

类型你的当前命名我的建议(优化/补充)说明
Drizzle 表定义xxxTable保持 xxxTable 或也可接受 xxxEntity推荐保持,语义明确,和 Zod/类型区分开
Zod 校验对象(运行时校验)xxxSchema保持 xxxSchema(驼峰)比如 insertuserTableselectuserTable,用途清晰
Zod 推断类型(运行时类型)type SelectUserType = ...可以保持,但建议再包装为 SelectUserVo(大驼峰)用于返回前端推荐为查询类结果统一使用 Vo 后缀,即使没有多表
返回给前端的类型(查询结果)可无 / SelectUserType✅ 推荐命名为 SelectUserVo(大驼峰 + Vo 后缀)表示“视图对象”,适合返回给前端展示,特别是表格、列表
前端提交的请求类型(新增/修改)可无 / InsertUserType✅ 推荐命名为 InsertUserDtoUpdateUserDto(大驼峰 + Dto 后缀)明确是数据传输对象,用于 API 请求
类型命名风格驼峰 or 大驼峰建议:Zod 推断类型保持驼峰(可选),但对外类型(Dto / Vo)统一用大驼峰大驼峰更适合表示“类型/类”,和接口文档、OpenAPI 更契合

✅ 每个模型一个文件(推荐!):user.model.ts

// src/models/user.model.ts

// 1. Drizzle 表定义
export const usersTable = pgTable('users', { ... });

// 2. Zod 校验规则(运行时校验)
export const insertuserTable = createInsertSchema(usersTable, { ... });
export const updateuserTable = createUpdateSchema(usersTable, { ... });
export const selectuserTable = createSelectSchema(usersTable);

// 3. 类型定义(可选,但推荐)
// 类型来源于 Zod 推断,但用更语义化的名字导出
export type InsertUserDto = z.infer<typeof insertuserTable>;  // 请求用
export type UpdateUserDto = z.infer<typeof updateuserTable>;  // 请求用
export type SelectUserType = z.infer<typeof selectuserTable>; // 查询返回原始类型

// 4. 推荐再包装一层,用于前端展示(加 Vo 后缀,大驼峰)
export type SelectUserVo = SelectUserType; // 可直接复用,或扩展字段(比如格式化日期等)

✅ 这样前端只需要关心:

  • InsertUserDto(新增请求用)
  • UpdateUserDto(修改请求用)
  • SelectUserVo(展示用,比如返回给表格)

✅ 【3】多表联查时的 Vo 命名建议

当你的查询涉及 多表联查 / 关联数据,比如 user + posts,建议:

  • 命名为:UserWithPostsVoUserDetailVo
  • 表明这是一个 复合视图对象,用于前端展示更复杂的页面
export type UserWithPostsVo = {
  user: SelectUserVo;
  posts: PostVo[];
};

✅ 这种 Vo 命名能清晰表达“这是一个组合视图,用于渲染页面或表格详情”


✅ 【5】边界情况处理建议

场景建议
不想手动写 Vo / Dto,直接用 Zod 推断类型?可以,但建议至少用 type SelectUserVo = z.infer<...> 包装并重命名,提升可读性
联表查询复杂,返回对象嵌套深?建议使用 UserDetailVoUserWithOrdersVo 等命名,表明是组合对象

✅ 四、最终推荐规范总结(结合你的想法 + 我的优化)

用途命名风格推荐命名示例后缀说明
Drizzle 表定义驼峰usersTableTable表示数据库表,语义清晰
Zod 校验规则(插入/更新/查询)驼峰insertuserTableselectuserTableSchema用于运行时校验
Zod 推断类型(原始查询结果)驼峰(可选)SelectUserTypeType可直接用,但推荐再包装
返回给前端的查询类型(推荐)大驼峰SelectUserVoVo表示视图对象,用于页面/表格展示
前端提交的数据类型(插入/更新)大驼峰InsertUserDtoUpdateUserDtoDto表示数据传输对象,用于 API 请求
多表联查返回类型大驼峰UserWithPostsVoUserDetailVoVo表示组合视图,适合详情页/复杂UI