typeof显示block.rows.length为number却报读取undefined的length错误?
问题分析与解决:Cannot read properties of undefined (reading 'length') 矛盾报错
问题重现
编写getPCfromStandBlock函数时遇到诡异问题:明明控制台输出显示block.rows为[]、length为0且类型是number,但代码却在block.rows.length这一行抛出TypeError: Cannot read properties of undefined (reading 'length')错误。已尝试用扩展运算符克隆对象,问题仍存在。
相关代码:
getPCfromStandBlock(b, prices: any[]) { let block = {...b} console.log("1",block.rows); console.log("2",block.rows.length); console.log("3",typeof(block.rows.length)); const obj: any = {}; if (block.rows.length == 0) { if ( block.graphics[0].hasOwnProperty('gaId') && block.graphics[0].pcBlock.length != 0 ) { obj.gaId = block.graphics[0].gaId; obj.priceCategory = block.graphics[0].pcBlock[0][0]; const price = prices.find( (p: { pcIndex: any }) => p.pcIndex === obj.priceCategory, ); obj.price = price; obj.freePlace = block.graphics[0].pcBlock[0][2]; return obj; } } return null; }
控制台输出:
1 [] 2 0 3 number /home/watchlist/src/event/event.controller.ts:521 console.log("2",block.rows.length); ^ TypeError: Cannot read properties of undefined (reading 'length')
核心原因
最可能的情况是函数被多次调用:控制台的输出是某次正常调用的结果,而报错来自另一次调用——这一次传入的b对象根本没有rows属性,导致block = {...b}后block.rows为undefined,访问length自然报错。
扩展运算符只会拷贝对象自身的可枚举属性,如果原对象b没有rows,克隆后的block也不会有这个属性。
解决方案
1. 增加存在性校验,避免空值访问
修改代码,先确认block.rows存在再访问其length,可选两种方式:
- 可选链操作符(TypeScript推荐):
// 日志和判断都加上可选链 console.log("1", block?.rows); console.log("2", block?.rows?.length); console.log("3", typeof(block?.rows?.length)); if (block?.rows?.length == 0) { // 后续逻辑 }
- 传统条件判断:
if (block.rows && block.rows.length == 0) { // 后续逻辑 }
2. 排查函数调用场景
在函数开头添加完整日志,追踪每一次调用传入的b对象:
getPCfromStandBlock(b, prices: any[]) { console.log('当前传入的b对象:', JSON.stringify(b)); // 打印完整结构 let block = {...b} // ... 原有代码 }
这样能快速定位到哪一次调用的b缺少rows属性,进而找到调用时机的问题(比如异步数据未加载完成就调用了函数)。
3. 类型约束(TypeScript优化)
给b定义接口,强制约束传入对象的结构,提前在编译阶段发现问题:
interface Block { rows: any[]; graphics: Array<{ gaId?: string; pcBlock?: any[][]; }>; } getPCfromStandBlock(b: Block, prices: any[]) { // ... 原有代码 }
内容的提问来源于stack exchange,提问作者Michael Mitch
相关产品推荐
相关产品推荐

