我有与此类似的代码-非常简单,只是为了展示这种情况。
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){,则错误为error TS2339: Property 'length' does not exist on type 'RowDataPacket[] | RowDataPacket[][] | OkPacket | OkPacket[]'.
我找不到任何方法可以将OkPacket重新定义为至少具有length?: number
那就足以忽略该错误(无论如何,大多数选择都不会获得OkPackets,如果我知道不是,我就不必检查每个选择的类型,如果我得到的不是OkPacket)...
答案 0 :(得分:0)
我也讨厌这个错误。 这是我的解决方法:
const [rows] = await db.query(`mySqlHere`);
let tempResult: any = rows;
console.log(tempResult.length); // OK
答案 1 :(得分:0)
我也不喜欢这方面的设计选择,但我通常使用:
const [rows, fields] = await conn.execute(QUERY_STRING) as any
console.log(rows.length)
答案 2 :(得分:0)
我遇到了类似的问题,并且能够通过检查查询的结果行是否为数组来修复 TypeScript 给出的警告“类型 'OkPacket' 上不存在属性 'length'”。这比使用 JSON.stringify() 将行转换为字符串要容易得多。
使用上面的原始示例,我将 result.length 比较更改为:
if (Array.isArray(result) && result.length === 0) {
return resolve(false);
}
答案 3 :(得分:-1)
我也找不到合适的方法来处理此问题,因此针对类似的情况,最终得到了以下解决方法:
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");
您也可以使用user defined 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;
}