具有严格空检查的TypeScript - 数组访问怎么样?

时间:2017-12-08 17:27:58

标签: types null typescript2.0 strictnullchecks

在TypeScript中,如果启用了严格的空检查,我希望编译器阻止我为变量分配nullundefined值,除非它允许null

但是,数组访问似乎允许绕过此检查。

示例:

let a: string[] = ["Hello"];
let s: string;

// 1) this produces an error, as expected
s = undefined

// 2) s is undefined here, too, but no error
s = a[3];
console.log(s);

Runnable version on the TypeScript Playground(注意:"严格空检查"必须在"选项"对话框中启用。)

这里发生了什么?

  • 这是TypeScript编译器中的错误吗?
  • 还是故意遗漏?
  • 如果是后者,这是否记录在任何地方(理想情况下有理由说明为什么要这样做?)

2 个答案:

答案 0 :(得分:4)

找到它: - )。

tl;博士:这是故意遗漏。数组访问在TypeScript代码中非常常见,并且对于开发人员来说,强制对每次访问进行空/未定义检查都被认为太麻烦了。

在讨论中已经多次提出这个问题:

关于PR 7140的评论有一个很好的理由来自Anders Hejlsberg(核心开发人员之一):

  

索引只会生成匹配中声明的类型的值   索引签名。即使它在技术上更正确,它也会   如果我们自动将undefined添加到类型中,那就太痛苦了   每个索引操作。

     

例如,每个数组元素都可以访问   必须伴随着非空保护或!断言。一世   认为这会非常恼人。

答案 1 :(得分:1)

https://dev.to/angular/how-to-avoid-observables-in-angular-273h是新的编译器选项-TypeScript 4.1 introduced。除其他外,它向数组索引访问类型添加undefined

请考虑以下代码段(noUncheckedIndexedAccess):

const items = [1,2,3]
console.log(items[1]?.toString(10))
console.log(items[2].toString(10))

如果没有noUncheckedIndexedAccess,则items[2].toString(10)将被视为有效,并且在启用该选项时将无效。 items[1]?.toString(10)将在启用该选项时有效,就像Alex Neth在旧答案中的评论一样。