Javascript 类型“”上不存在属性“length”。。。mysql2模块中的OkPacket

Javascript 类型“”上不存在属性“length”。。。mysql2模块中的OkPacket,javascript,node.js,typescript,node-mysql2,Javascript,Node.js,Typescript,Node Mysql2,我有类似的代码-非常简单,只是为了说明情况 this.getCode = (code: string): Promise<codeObject | false> => { return new Promise((resolve, reject) => { pool.query('SELECT * FROM ?? WHERE code = ?', [TABLE, code], function (err, result) {

我有类似的代码-非常简单,只是为了说明情况

this.getCode = (code: string): Promise<codeObject | false> => {
        return new Promise((resolve, reject) => {
            pool.query('SELECT * FROM ?? WHERE code = ?', [TABLE, code], function (err, result) {
                if (err) {
                    return reject(err);
                }

                if (result.length === 0) {
                    return resolve(false);
                }
            });
        });
    };
如果result.length==0{,则行中存在问题,错误为错误TS2339:类型“RowDataPacket[]| RowDataPacket[].[]| OkPacket | OkPacket[]”上不存在属性“length”

我找不到任何方法来重新定义OkPacket,使其至少具有长度?:number
这就足够忽略大多数选择都不会得到OK数据包的错误了,我不想在我知道不是OK数据包的情况下检查每个选择上的类型…

我也找不到正确的方法来处理这个问题,所以我的类似案例的解决方法是:

const [rows,] = await connection.execute("SELECT id FROM users WHERE email = ?", [profile.email]);
if ((rows as any).length === 1) {
   return (rows as any)[0].id;
}
logger.error("Unexpected query response", rows);
throw Error("This code should never be executed");
您也可以使用。如下所示:

const isRowDataPacket = (rows: RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[] | ResultSetHeader): rows is RowDataPacket[] | RowDataPacket[][] => {
    return (rows as RowDataPacket[] | RowDataPacket[][]).length !== undefined
}
但您仍需要进行进一步的类型转换以正确解释每一行:

const [rows,] = await connection.execute("SELECT id FROM users WHERE email = ?", [profile.email]);
if (isRowDataPacket(rows) && rows.length === 1) {
    return (rows[0] as { id: string }).id;
}
我也讨厌这个错误。 这是我的解决方法:

const [rows] = await db.query(`mySqlHere`);
let tempResult: any = rows;

console.log(tempResult.length); // OK

什么是[表]?它的const TABLE:string=TABLE_name;您对类型检查的反对意见是什么?似乎是处理这一问题最直接的方法。在每一个处理选择大多数类型的函数中,我都需要找出哪个结果不是OkPacket,而我甚至无法让该类进行实例检查。而且我不希望有数百万行只是检查构造函数名是否为“OkPacket”,因为它真的很蹩脚。我最后检查了那个该死的东西-只是检查了as any。但这使得tempResult成为any,这对typescript来说并不是更好。是的,我知道,但我找不到办法消除那个警告。关于typescript还有很多需要了解的地方