带Promise的fetch函数返回后,数组id字段全部变为0的问题排查
问题排查与解决方案
以下是几个最可能的原因及对应的排查/解决方法:
1. 返回后的数组被后续代码意外修改
数组属于引用类型,你返回的数组和后续代码操作的是同一份内存数据。如果在函数返回后,有其他逻辑遍历数组并将id重置为0,就会出现「打印时正确、返回后变0」的情况。
- 排查验证:
在GetResolutionsAsync函数的return语句前,给数组做深拷贝后再返回,比如:
若返回值的return JSON.parse(JSON.stringify(data));id恢复正常,说明是后续代码修改了原数组。
2. TypeScript类型定义的类与实际数据不匹配
如果BaseReference是类而非接口,且类中默认将id初始化为0:
class BaseReference { id: number = 0; name: string = ''; }
通过fetch获取的是普通JSON对象,并非类实例。若后续代码有逻辑将这些对象转换为类实例(比如用class-transformer的plainToInstance),且转换时未正确读取原始id,就会被类的默认值覆盖为0。
- 解决方法:
- 若不需要类的实例方法,将
BaseReference改为接口:interface BaseReference { id: number; name: string; } - 若必须用类,手动将JSON属性赋值给类实例:
return data.map(item => Object.assign(new BaseReference(), item));
- 若不需要类的实例方法,将
3. 响应解析时的隐式类型异常
极少数情况下,服务器返回的id是字符串类型(如"123"),但类型定义为number。若后续代码对id做了错误的类型转换(比如非预期的空值处理),可能导致id变为0。
- 排查验证:
在response.json()后打印typeof data[0].id,确认实际类型。如果是字符串,手动转换为数字:return data.map(item => ({ id: parseInt(item.id, 10), name: item.name }));
内容的提问来源于stack exchange,提问作者Quribe
相关产品推荐
相关产品推荐

