TypeScript中while判断数组非空时shift()报undefined错误如何解决
问题原因
你开启了strict模式(包含strictNullChecks校验规则),TypeScript的类型系统中Array.shift()方法的返回值类型天生是T | undefined,即便你用while(queue.length)保证了循环进入时队列非空,但TypeScript不会做跨语句的逻辑推导,无法识别你在循环内调用shift()时队列仍然有元素,所以会报错提示对象可能为undefined。
可选解决方案
你不需要必须写显式检查,有三种常用方案可选,按推荐度排序如下:
- 方案1:显式添加空值判断(最安全,推荐)
只需要在shift()后加一行空值判断即可,既不影响运行效率,也能避免后续修改代码逻辑时不小心引入空值风险:
加完这段后TypeScript会自动识别后续代码中let currentNode = queue.shift(); // 新增空值判断 if (!currentNode) break;currentNode必然不为undefined,报错直接消失。 - 方案2:使用非空断言操作符(最简单)
如果你100%确认此处逻辑不可能返回undefined,可以直接在shift()后加非空断言!,告诉TypeScript你确定这个值不会为空:
这个方案不需要修改逻辑,一行即可解决问题,但要注意如果后续你修改了循环逻辑或者队列操作逻辑,可能会引入运行时空值错误,需要自己保证逻辑正确性。let currentNode = queue.shift()!; - 方案3:关闭
strictNullChecks(极不推荐)
你可以在tsconfig.json的compilerOptions中添加"strictNullChecks": false,直接关闭空值校验规则,但会丢失大量TypeScript的类型安全保障,完全不建议这么做。
内容的提问来源于stack exchange,提问作者Bamontan
相关产品推荐
相关产品推荐

