Node.js中mysql2的OkPacket[]类型编译与运行错误解决问询
错误原因与解决方法
错误原因
类型定义错误引发编译报错
你将deleteRes的类型定义为[OkPacket[], FieldPacket[]],但mysql2执行DELETE这类无结果集返回的SQL语句时,实际返回的结构是[OkPacket, FieldPacket[]]——第一个元素是单个OkPacket对象,而非数组。编译阶段TypeScript会严格按照你定义的类型校验,认为deleteRes[0]是数组,不存在affectedRows属性,因此抛出TS2339错误;但运行时实际拿到的是单个对象,所以deleteRes[0].affectedRows能正常取值。错误修改导致运行时异常
改成deleteRes[0][0].affectedRows后,虽然符合你错误的类型定义(数组取第一个元素),但实际运行时deleteRes[0]是单个OkPacket对象而非数组,[0]会取到undefined,进而抛出TypeError: 无法读取undefined的affectedRows属性。
一次性解决方法
修正deleteRes的类型定义为mysql2实际返回的结构即可,同时推荐用解构赋值简化代码:
方法1:显式指定正确类型
import { OkPacket, FieldPacket } from 'mysql2'; // 假设connection是已初始化的mysql2连接实例 const deleteRes: [OkPacket, FieldPacket[]] = await connection.execute( 'DELETE FROM your_table WHERE id = ?', [123] ); console.log(deleteRes[0].affectedRows); // 编译通过,运行正常
方法2:结合泛型解构赋值
import { OkPacket } from 'mysql2'; // 直接解构出OkPacket对象,通过泛型约束返回类型 const [okPacket] = await connection.execute<[OkPacket, unknown[]]>( 'DELETE FROM your_table WHERE id = ?', [123] ); console.log(okPacket.affectedRows); // 代码更简洁,编译与运行均正常
内容的提问来源于stack exchange,提问作者Pierogi
相关产品推荐
相关产品推荐

