遍历数组时在回调里写了 if (!item) return,循环结束后再取 items[0].id,编辑器报 TS18048 items[0] is possibly 'undefined'。守卫就写在上面几行。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

const list = items.filter((x): x is Item => !!x);
const first = list.at(0);
if (!first) return;
console.log(first.id);

收窄只对当前作用域里那个变量有效,回调是另一个函数作用域,循环结束后编译器带不出这个结论。索引访问本身也不在收窄范围内。这一点先确认清楚,后面就不用反复试。

「回调内类型收窄」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,把守卫提到循环外面 用变量接收结果;或者用类型谓词过滤出非空数组再遍历;循环里确实要收窄就在回调内部完成取值 别留到外面。

改完照着核一遍,外部取值不再报可能为空 过滤后的长度和预期一致 空数组时走兜底分支。

作者 9823189