You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:33:12