TypeScript null检查不注意array.length检查

时间:2018-04-05 02:43:53

标签: javascript typescript types null type-inference

使用严格的空值检查编译TypeScript时,即使它没有问题,下面也不会键入check:

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

编译错误是:

  

类型'数字|的参数undefined'不能赋值给参数   'number'类型。类型'undefined'不能分配给类型   '编号'

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

有些问题:

  1. 为什么编译器不聪明?为这种情况添加更智能的空值检查是非常困难的,还是TS团队尚未实现的直接原因?
  2. 编写上述哪种仍然是类型检查的最惯用的方法是什么?
  3. Re 2,我能想到的最好的方法是在循环体上添加一个多余的检查:

    while (arr.length) {
        const num = arr.pop()
        if (num) { // make the compiler happy
            f(num)
        }
    }
    

1 个答案:

答案 0 :(得分:3)

是的,将这种智能添加到编译器被认为是困难的,请参阅this comment关于描述问题的非常确切的问题。

同时,您可以使用non-null assertion - postfix ! - 告诉编译器您知道该值不为null:

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