You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:05:11