数组为空时TypeScript不执行类型检查,如何开启对应校验?
TypeScript 数组空值索引访问校验方案
TypeScript 默认不会对数组的索引访问做边界校验,当数组为空时,访问下标对应的属性不会触发编译报错,仅会在运行时抛出异常,你给出的代码符合该默认行为。
解决方案
方案1:全局开启索引访问校验配置
在tsconfig.json的compilerOptions中开启noUncheckedIndexedAccess配置项:
{ "compilerOptions": { "noUncheckedIndexedAccess": true } }
开启后效果:
- 所有数组索引访问结果、对象索引签名属性的类型会自动联合
undefined - 你的示例代码会直接触发编译报错:对象可能为 "undefined"
- 必须通过类型收窄(如非空判断、可选链)才能访问属性:
// 可选链写法,不会报错 l[0]?.name // 非空判断收窄类型 if (l[0]) { console.log(l[0].name) }
方案2:针对特定数组声明为非空数组类型
如果业务逻辑要求该数组必须至少存在一个元素,不需要全局开启配置,可以直接定义非空数组类型:
// 非空数组类型定义 type NonEmptyArray<T> = [T, ...T[]] type List = NonEmptyArray<{ name: string }> const l: List = [] // 编译直接报错:不能将类型“[]”分配给类型“NonEmptyArray<{ name: string; }>”
这种方案会在数组初始化赋值为空的时候就提前报错,从根源避免后续的索引越界问题。
注意事项
noUncheckedIndexedAccess属于严格校验规则,开启后会增加一定的类型编码成本,需要根据项目的严格程度按需开启。
内容的提问来源于stack exchange,提问作者Zcc
相关产品推荐
相关产品推荐

