grep -rn "!\." src | wc -l grep -rn "!\." src | cut -d: -f1 | sort | uniq -c | sort -rn | head // .eslintrc 里开 no-non-null-assertion
全仓搜出 700 多个感叹号断言,上线后还是报 Cannot read properties of undefined reading 'name',堆栈正好落在其中一个加了断言的位置。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:非空断言只是让编译器闭嘴,运行时不做任何检查。它把可能为空的地方标成一定存在,数据真没来的时候错误被推到更远一层,堆栈离根因更远。
这次卡住的地方就在「非空断言风险」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
处理上按这个顺序:先统计非空断言集中在哪些文件 按目录排一下;把取值改成可选链加默认值 缺字段时走兜底;确实必须存在的字段在入口校验一次 之后再断言;新增代码用 lint 规则拦住。
确认没问题再收工,同一处报错不再出现 断言数量降到百位以内 缺字段时显示占位而不是白屏。
