如何将mysql2查询结果直接转换为TypeScript的User类对象?
问题:将MySQL查询结果转换为User类实例
我定义了如下User类:
export class User { private username: string; private first_name: string; private last_name: string; private birthdate: Date; private gender: number; private password: string; private role_id: number; private id: number | undefined; constructor( username: string, first_name: string, last_name: string, birthdate: Date, gender: number, password: string, role_id: number, id: number | undefined = undefined ) { this.username = username; this.first_name = first_name; this.last_name = last_name; this.birthdate = birthdate; this.gender = gender; this.password = password; this.role_id = role_id; this.id = id; } }
我可以通过save()函数将该类实例保存到数据库,但使用mysql2查询数据库获取用户数据时,希望像ORM那样直接将查询结果转换为User对象。当前查询函数如下:
export async function getUsers(){ const [result] = await conn.query<RowDataPacket[]>("SELECT * from users") return result }
我曾尝试创建继承自RowDataPacket的IRowUser接口,但未能解决问题,特此寻求解决方案。
解决方案
1. 定义与数据库行匹配的类型接口
先定义继承自RowDataPacket的接口,确保类型校验和提示正常:
import { RowDataPacket } from 'mysql2'; interface IRowUser extends RowDataPacket { id: number; username: string; first_name: string; last_name: string; birthdate: Date | string; // 兼容数据库返回的字符串或Date类型 gender: number; password: string; role_id: number; }
2. 编写转换函数
由于User类属性均为private,只能通过构造函数创建实例,因此编写映射函数将数据库行数据转为User对象:
function createUserFromRow(row: IRowUser): User { // 处理birthdate:字符串类型转为Date对象 const birthdate = typeof row.birthdate === 'string' ? new Date(row.birthdate) : row.birthdate; return new User( row.username, row.first_name, row.last_name, birthdate, row.gender, row.password, row.role_id, row.id ); }
3. 修改查询函数转换结果
更新getUsers函数,将查询到的每一行数据都转换成User实例:
export async function getUsers(): Promise<User[]> { const [result] = await conn.query<IRowUser[]>("SELECT * from users"); return result.map(row => createUserFromRow(row)); }
补充说明
- 若数据库中
birthdate存储为日期字符串,必须手动转为Date对象,否则会出现类型不匹配问题 - 这种手动映射方式适合简单场景,若后续需要更复杂的数据库操作,可考虑引入TypeORM、Prisma等成熟ORM框架
内容的提问来源于stack exchange,提问作者Brandon Suiveng
相关产品推荐
相关产品推荐

