强类型语言中类型校验的逻辑是怎样的。

54 阅读1分钟

今天写dart的时候发现一个问题: 类似于:

List? AA;
List BB = [1, 2, 3];
 if (true) {
   AA = [];
   AA.add(1);
   BB.forEach((element) {
       AA!.add(element);
   });
}

这样的代码,我的第二个AA.add就需要使用!进行非空断言。这是为什么呢。

最开始我以为是dart类型校验的问题。后来在ts上也尝试的同样的写法,仍然存在这个问题。

let AA: number[] | undefined;
let BB = [1, 2, 3]
if (1) {
    AA = []
    AA.push(1)
    BB.forEach(e => {
        AA!.push(123)
    })
}

这是由于编译器本身实现原理导致的吗?