为什么在 TypeScript 中,通过索引访问的数组元素的类型没有“未定义”?

Mik*_*ike 3 typescript

我注意到在下面的例子中的类型cnumber,不是number|undefined

const a:number[] = []
const c = a[1]
Run Code Online (Sandbox Code Playgroud)

换句话说,我可以做到

let b:number = a[1]
Run Code Online (Sandbox Code Playgroud)

没有问题, whilea[1]可以undefined。这可能会导致代码中隐藏的错误。我错过了什么吗?

Ale*_* L. 6

在下一个版本的 typescript (4.1) 中,您将能够使用noUncheckedIndexedAccess(又名迂腐索引签名检查)编译器选项启用所需的行为:

  • 在读取位置中使用的任何索引访问表达式 obj[index] 将在其类型中包含 undefined ,除非 index 是字符串文字或数字文字,并且先前的缩小有效
  • 任何属性访问表达式 obj.prop 不存在匹配的名为 prop 的声明属性,但字符串索引签名确实存在,将在其类型中包含 undefined ,除非先前对 obj.prop 的缩小有效

所以a[1]会导致number | undefined. 你已经可以通过安装来尝试了typescript@next

公告

公关