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

如何编写TypeScript类型守卫排除null、undefined与全null数组?

问题修复说明

原有代码失效原因

  • 错误使用typeof判断null值:typeof运算符返回的结果始终是字符串,typeof null的返回值为"object",因此typeof condition[0] === null的条件永远无法成立,全null数组不会被正常拦截
  • 数组判断逻辑不严谨:仅检测数组第一个元素是否为null,无法覆盖数组首位非null、其余元素全为null的漏判场景,也会出现数组首位为null、其余元素存在有效值的误判问题

正确实现说明

你后续调整的代码已经解决了上述问题:
使用Array.every()方法遍历数组所有元素,判断所有元素均为null时才触发拦截,逻辑完全符合需求。

export default function validData<T>(  
  condition: T
): asserts condition is Exclude<T, null | undefined | null[]> {
  if (
    condition === null ||
    condition === undefined ||
    (Array.isArray(condition) && condition.every((x) => x === null))
  ) {
    throw new Error(
      `missing data: ${condition} returned null, null[] or undefined`
    );
  }
}

可选优化(针对空数组场景)

注意空数组调用every()方法会直接返回true,如果你的业务场景中需要将空数组视为合法值,可以调整数组判断逻辑:

(Array.isArray(condition) && condition.length > 0 && condition.every(x => x === null))

类型报错说明

你遇到的XXX is not assignable to type null[]报错,是因为原有错误的数组判断逻辑无法让TypeScript正确识别你已经排除了null[]类型,修复判断逻辑后类型收窄会正常生效,报错即可消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:54:02