TypeScript中Oracle查询结果无法转为Number格式,仅返回unknown求助
解决TypeScript中Oracle查询结果无法转为number类型的问题
问题根源
showfunds.rows是行数据的数组集合,直接对整个数组调用parseFloat完全不符合方法参数要求,自然无法得到正确数字。- TypeScript无法自动推断Oracle查询返回的
rows结构,默认标记为unknown[]类型,直接操作会触发类型报错。
修复方案
按以下逻辑调整代码:
- 先判断查询结果是否存在有效数据,避免空数组访问报错
- 取出目标行的
WALLET_VALUE字段 - 显式处理类型转换,兼容数据库返回字符串或数字的情况
- 增加类型定义让TypeScript识别返回结构
修改后的完整代码
// 定义接口,让TypeScript识别查询结果的结构 interface AccountWallet { WALLET_VALUE: number | string; } async function withDraw(email: string, password: string, valuetowithdraw: number) { OracleDB.outFormat = OracleDB.OUT_FORMAT_OBJECT; let connection = await OracleDB.getConnection({ user: process.env.ORACLE_USER, password: process.env.ORACLE_PASSWORD, connectString: process.env.ORACLE_CONN_STR }); try { // 用泛型指定返回结果类型,消除unknown const showfunds = await connection.execute<AccountWallet>( `SELECT WALLET_VALUE FROM ACCOUNTS WHERE EMAIL = :email AND PASSWORD = :password`, [email, password] ); // 先检查是否查询到账号数据 if (showfunds.rows.length === 0) { throw new Error("账号不存在或密码错误"); } // 取出第一行的钱包金额 const walletRecord = showfunds.rows[0]; // 转换为number,兼容数据库返回字符串的情况 const valueInwallet = typeof walletRecord.WALLET_VALUE === 'string' ? parseFloat(walletRecord.WALLET_VALUE) : walletRecord.WALLET_VALUE; // 验证转换后是否为有效数字 if (isNaN(valueInwallet)) { throw new Error("钱包金额格式异常"); } if (valuetowithdraw <= valueInwallet && valuetowithdraw > 0) { if (valuetowithdraw <= 100) { await connection.execute( `UPDATE ACCOUNTS SET WALLET_VALUE = WALLET_VALUE - (:valuetowithdraw * 0.96) WHERE EMAIL = :email AND PASSWORD = :password`, [valuetowithdraw, email, password] ); return true; } } return false; } finally { // 确保数据库连接被释放,避免资源泄漏 await connection.close(); } }
额外说明
- 加入
try/finally块保证连接一定会释放,防止长期占用数据库连接资源 - 增加空结果和无效数字的判断,避免程序出现未处理的异常
- 泛型
<AccountWallet>的使用让TypeScript能正确推断rows的字段类型,解决unknown类型问题
内容的提问来源于stack exchange,提问作者Gabriel Campos
相关产品推荐
相关产品推荐

