TypeScript中检查数组存在且长度非零的最简洁惯用写法是什么?
最简洁的TypeScript判断方案
嘿,太懂这种想把冗余判断简化的心情了!你现在的写法确实能用,但咱们可以把它变得更清爽。
1. 最简洁的直接判断
其实你想要的“存在、是数组且至少有一个元素”,用可选链结合数组length的布尔特性就能实现:
if (thingies?.length) { // 这里可以安全访问thingies[0] }
原理很简单:
- 如果
thingies是undefined或null,thingies?.length会返回undefined,在if条件里被视为false; - 如果
thingies是空数组,length为0,同样会被视为false; - 只有当
thingies是非空数组时,length大于0,条件才会成立。
这完全等价于你原来的(thingies?.length ?? 0) > 0,但简洁太多了!
2. 更严谨的类型守卫方案(带类型推断)
如果希望TypeScript能在判断后自动推断thingies是数组类型(避免后续访问时的类型警告),可以写个小巧的工具函数:
const hasItems = <T>(arr: T[] | undefined | null): arr is T[] => !!arr?.length; // 使用方式 if (hasItems(thingies)) { // 这里TypeScript会明确知道thingies是T[]类型,访问thingies[0]绝对安全 console.log(thingies[0]); }
这个方案不仅简洁,还能帮你做类型校验,在大型项目里特别实用。
3. 针对类数组对象的严谨判断
如果thingies可能是类数组对象(比如DOM的NodeList),而你只想针对纯数组做判断,可以结合Array.isArray:
if (Array.isArray(thingies) && thingies.length) { // 逻辑代码 }
不过如果你的类型定义里已经明确thingies是数组或undefined/null,前面两种方案就足够了。
内容的提问来源于stack exchange,提问作者Sasgorilla
相关产品推荐
相关产品推荐

