TypeScript 正确输入查询结果 MySQL
TypeScript correctly type a queryresult MySQL
我正在使用 mysql2/promise
npm package 连接和查询 MySQL 数据库。我在尝试为我的查询结果设置正确的类型时感到困惑,因为我事先不知道结果是什么类型。
我创建了一个数据库 class,它有一个异步 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
可以,但感觉不对。有没有一种干净的方法可以做到这一点?
将函数键入:
async query<T = unknown>(sql: string, options?: unknown): Promise<T[]> {
然后这样使用函数:
const users = await db.query<IUser>(sql);
在@Evert 和 的帮助下,我找到了解决方案
我创建了以下类型:
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);
我正在使用 mysql2/promise
npm package 连接和查询 MySQL 数据库。我在尝试为我的查询结果设置正确的类型时感到困惑,因为我事先不知道结果是什么类型。
我创建了一个数据库 class,它有一个异步 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
可以,但感觉不对。有没有一种干净的方法可以做到这一点?
将函数键入:
async query<T = unknown>(sql: string, options?: unknown): Promise<T[]> {
然后这样使用函数:
const users = await db.query<IUser>(sql);
在@Evert 和
我创建了以下类型:
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);