【问题标题】:TypeScript correctly type a queryresult MySQLTypeScript 正确键入查询结果 MySQL
【发布时间】:2021-12-07 16:19:28
【问题描述】:

我正在使用mysql2/promise npm package 连接和查询 MySQL 数据库。我在尝试为查询结果设置正确的类型时感到困惑,因为我事先不知道结果将是什么类型。

我创建了一个具有异步query 方法的数据库类。

// Database.ts
import mysql, { Pool } from "mysql2/promise"; // import mysql2/promise

export class Database implements IDatabase {
  logger: ILogger;
  pool: Pool;

  constructor(logger: ILogger) {
      this.logger = logger;
      // pool connection is set up here
  }

  async query(sql: string, options?: unknown): Promise<unknown> { // type?
      const [rows] = await this.pool.query(sql, options);
      return rows;
  }
}

在我的服务器代码中,我希望能够执行以下操作:

// server.ts
import { Database } from "./core/Database";
const db = new Database(logger);

app.get("/", async (req, res) => {
  const sql = `
      select *
      from users;
  `;
  const users: IUser[] = await db.query(sql); // get people

  // do some logic x

  // send response
  res.json({
      result: x
  });
});

使用unknown 不起作用,因为我无法将它分配给我的类型,使用any 可以,但感觉不对。有没有干净的方法来做到这一点?

【问题讨论】:

    标签: mysql node.js typescript promise


    【解决方案1】:

    将函数键入为:

    async query<T = unknown>(sql: string, options?: unknown): Promise<T[]> { 
    

    然后这样使用函数:

    const users = await db.query<IUser>(sql);
    

    【讨论】:

    • 您的回答引导我朝着正确的方向前进,仅供参考:我添加了我的解决方案。
    【解决方案2】:

    在@Evert 和this answer 的帮助下,我找到了解决方案

    我创建了以下类型:

    export type DbDefaults = RowDataPacket[] | RowDataPacket[][] | OkPacket[] | OkPacket;
    export type DbQueryResult<T> = T & DbDefaults;
    

    像这样重写我的方法:

    async query<T>(sql: string, options?: unknown): Promise<DbQueryResult<T[]>> {
      const [result] = await this.pool.query<DbQueryResult<T[]>>(sql, options);
      return result;
    }
    

    我现在可以这样使用它:

    const sql = `
      select *
      from users;
    `;
    
    const people = await db.query<IUser>(sql);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2013-11-05
      相关资源
      最近更新 更多