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

TypeScript排序IActivity数组后可打印对象但访问属性返回undefined

问题排查与修复方案

1. 先解决console.log的快照误导问题

浏览器打印引用类型时不会存储执行时刻的快照,你看到的对象属性是点击展开那一刻的最新值,不是执行打印代码时的实际值。现在你打印整个对象能看到属性、打印单个属性返回undefined,大概率是执行console.log(test.description)的时候description确实还没赋值,后续异步逻辑补全了属性,等你去控制台点开对象时才看到完整属性。
直接改成打印执行时刻的快照确认问题:

console.log(JSON.parse(JSON.stringify(test)))

如果这时候打印出来的对象没有description,就说明是运行时属性缺失的问题。

2. 调整MobX响应式对象的访问逻辑

你用到了toJS方法说明当前操作的是MobX的可观察对象,不需要转成普通JS对象再访问属性,直接读取原响应式对象的属性即可:

sortedActivities.forEach(activity => {
  console.log(activity.description)
})

如果是MobX版本或者配置的问题,错误时机调用toJS反而可能丢失属性。

3. 修复排序逻辑的潜在隐患

Array.sort是原地排序方法,会直接修改传入的原数组,如果你传入的activities是MobX可观察数组,原地排序会触发额外的响应式更新,很容易出现意料之外的问题。建议先拷贝数组再排序,顺便补充date为null的边界处理:

const sortedActivities = [...activities].sort((a, b) => {
  const aTimestamp = a.date ? new Date(a.date).getTime() : 0
  const bTimestamp = b.date ? new Date(b.date).getTime() : 0
  return aTimestamp - bTimestamp
})

4. 校验运行时字段匹配性

TypeScript的接口定义只做编译时检查,运行时拿到的数据字段如果和定义不一致(比如后端返回的是首字母大写的Description,或者是desc缩写),也会出现能在控制台看到属性、但按接口定义的字段名访问返回undefined的情况,可以直接打印所有键确认:

console.log(Object.keys(test))

内容的提问来源于stack exchange,提问作者Lupus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:36:06