4

我有类似的代码 - 非常简单,只是为了展示案例。

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);
                }
            });
        });
    };

问题在于if (result.length === 0) {,错误是error TS2339: Property 'length' does not exist on type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[]'.

我找不到任何方法来重新定义 OkPacket 至少length?: number 足以忽略该错误(大多数选择无论如何都没有得到 OkPackets,如果我知道的时候我得到的不是 OkPacket,我不想检查每个选择的类型这不是)...

4

4 回答 4

0

我也讨厌这个错误。这是我的解决方法:

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

console.log(tempResult.length); // OK
于 2020-10-27T07:09:08.910 回答
0

我也找不到合适的方法来处理这个问题,所以在我的类似案例中使用了这个解决方法:

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");

您还可以使用用户定义的 type-guards。像这样:

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;
}
于 2020-10-20T11:33:16.950 回答
0

我遇到了类似的问题,并且能够通过检查查询的结果行是否为数组来修复 TypeScript 给出的警告,“类型'OkPacket'上不存在属性'长度'”。这对我来说比使用 JSON.stringify() 将行转换为字符串要容易得多。

使用上面的原始示例,我会将 result.length 比较更改为:

if (Array.isArray(result) && result.length === 0) {
   return resolve(false);
}
于 2021-07-03T00:16:59.340 回答
0

我也不喜欢这方面的设计选择,但我通常使用:

const [rows, fields] = await conn.execute(QUERY_STRING) as any
console.log(rows.length)
于 2021-06-30T12:32:10.307 回答