在TypeScript中,如果启用了严格的空检查,我希望编译器阻止我为变量分配null
或undefined
值,除非它允许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(注意:"严格空检查"必须在"选项"对话框中启用。)
这里发生了什么?
答案 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在旧答案中的评论一样。