迁移至TypeScript:是否需要为每张数据库表定义查询解构用interface?
pg-promise 配合 TypeScript 的类型处理方案
更优的落地方式
你提到的第三种方案的核心痛点是手动维护类型和表结构的同步成本,这个问题可以通过自动生成类型的方式完全解决:
- 使用支持从PostgreSQL表结构直接生成TS类型的工具,连接到你的数据库实例后一键生成所有20张表的Interface文件,不需要手动写任何代码。
- 后续表结构发生变更时,只需要重新执行一次生成脚本就能同步更新类型,完全不存在手动维护的同步风险,使用体验和你手动写的单表类型完全一致。
手动维护单表类型时的关联查询处理
如果选择手动维护单表类型,不需要为每个关联查询单独写完整的Interface,直接用TS内置的类型工具组合已有单表类型即可:
简单关联场景(无重名字段、无聚合字段)
用Pick筛选两张表需要的字段,再用交叉类型&拼接成新的查询返回类型:
// 已提前定义好单表类型 User、Order type UserOrder = Pick<User, 'name' | 'age'> & Pick<Order, 'order_id' | 'create_time'> // pg-promise原生支持泛型参数,直接传入类型即可 const data = await db.query<UserOrder>(` SELECT u.name, u.age, o.order_id, o.create_time FROM users u INNER JOIN orders o ON u.id = o.user_id `)
复杂关联场景(含重名字段、聚合计算字段)
在基础类型拼接的基础上,单独定义新增的特殊字段即可:
type UserOrderStat = Pick<User, 'name' | 'id'> & { // 单独定义聚合字段/重名字段 order_count: number total_pay: number } const statData = await db.query<UserOrderStat>(/* 带分组聚合的关联查询语句 */)
内容的提问来源于stack exchange,提问作者LearnDude
相关产品推荐
相关产品推荐

