遍历数组时在回调里写了 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);
收窄只对当前作用域里那个变量有效,回调是另一个函数作用域,循环结束后编译器带不出这个结论。索引访问本身也不在收窄范围内。这一点先确认清楚,后面就不用反复试。
「回调内类型收窄」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,把守卫提到循环外面 用变量接收结果;或者用类型谓词过滤出非空数组再遍历;循环里确实要收窄就在回调内部完成取值 别留到外面。
改完照着核一遍,外部取值不再报可能为空 过滤后的长度和预期一致 空数组时走兜底分支。
