从联合类型数组里过滤掉 null 再取第一个元素的字段,报 TS2531 Object is possibly 'null'。回调写的是 x => x !== null,看着已经排干净了。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,普通布尔返回值的回调不会改变元素类型,filter 只保证长度变短,不保证元素形状。要让它收窄,回调的返回类型必须显式写成 x is T 的类型谓词。
「类型谓词收窄」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。
const list: (Item | null)[] = []; const ok = list.filter((x): x is Item => x !== null); console.log(ok[0].id);
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,把回调改成带类型谓词的写法 返回 x is Item;确认断言的条件和真正的判空逻辑一致;检查 map 和 reduce 的回调有没有同样的问题。
最后用这个标准收尾,取字段不再报可能为空 悬停看数组类型已经去掉 null。
