让我分析一下当 data 为 null 时会发生什么。 Ran tool 当 data 为 null 时,让我逐行分析可能发生的错误:
-
这里:
allClasses.current = data?.class_students || [];- 如果
data为null,data?.class_students会返回undefined - 由于使用了
|| [],这里会被赋值为空数组[] - 这行不会出错
- 如果
-
这里:
const { active, disable } = data?.class_students?.reduce(...)- 如果
data为null,data?.class_students为undefined undefined?.reduce(...)会返回undefined- 这会导致解构赋值错误 :
TypeError: Cannot destructure property 'active' of 'undefined' as it is undefined.
- 如果
让我查看这个函数的完整上下文,确认我的分析: Read file: /Users/chenyao/myProjects/teacher-web/src/pages/SchoolManage/component/MistakeStudent/index.tsx Ran tool
分析结果
当 data 为 null 时,会在 第83行 发生错误:
具体错误:
javascript
const { active, disable } = data?.class_students?.reduce(...)
-
如果
data为null,data?.class_students返回undefined -
undefined?.reduce(...)也返回undefined -
尝试从
undefined中解构{ active, disable }会抛出:javascriptTypeError: Cannot destructure property 'active' of 'undefined' as it is undefined.
为什么会出错:
- 可选链操作符
?.只是避免了在null/undefined上调用方法时的错误 - 但是
reduce方法在undefined上调用时返回undefined - 解构赋值
const { active, disable } = undefined会失败
修复建议:
javascript
const { active, disable } = data?.class_students?.reduce(
// ... reduce logic
) || { active: [], disable: [] };
或者更安全的写法:
javascript
const classStudents = data?.class_students || [];
const { active, disable } = classStudents.reduce(
// ... reduce logic
{ active: [], disable: [] }
);
这样即使 data 为 null,代码也能正常执行,active 和 disable 都会被初始化为空数组。