打字稿null检查不关注array.gength检查



使用严格的null检查编译打字稿时,即使可以键入检查,也不会输入检查:

const arr: number[] = [1, 2, 3]
const f = (n: number) => { }
while (arr.length) {
    f(arr.pop())
}

汇编错误是:

类型'数字的参数|不确定的'无法分配给参数 类型的"数字"。类型"未定义"不能分配给类型 "数字"。

似乎编译器不够聪明,无法知道arr.pop()肯定会返回一个数字。

一些问题:

  1. 为什么编译器不聪明?为这种情况添加更智能的无效检查是否非常困难,或者TS团队尚未实施的直接情况?
  2. 写入上面仍然类型检查的最惯用方法是什么?

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()!)
}

相关内容

  • 没有找到相关文章