使用严格的null检查编译打字稿时,即使可以键入检查,也不会输入检查:
:const arr: number[] = [1, 2, 3]
const f = (n: number) => { }
while (arr.length) {
f(arr.pop())
}
汇编错误是:
类型'数字的参数|不确定的'无法分配给参数 类型的"数字"。类型"未定义"不能分配给类型 "数字"。
似乎编译器不够聪明,无法知道arr.pop()
肯定会返回一个数字。
一些问题:
- 为什么编译器不聪明?为这种情况添加更智能的无效检查是否非常困难,或者TS团队尚未实施的直接情况?
- 写入上面仍然类型检查的最惯用方法是什么?
re 2,我能想到的最好的是在循环的主体中添加多余的检查:
while (arr.length) {
const num = arr.pop()
if (num) { // make the compiler happy
f(num)
}
}
是的,将这种智能添加到编译器被认为很困难,请参阅有关描述您问题的非常确切的问题的评论。
与此同时,您可以使用非无效断言-Fostfix !
-告诉编译器您知道该值不是null:
const arr: number[] = [1, 2, 3]
const f = (n: number) => { }
while (arr.length) {
f(arr.pop()!)
}