如何编写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
相关产品推荐
相关产品推荐

