TypeScript严格null检查数组中对象的字段

时间:2018-04-21 22:13:13

标签: typescript

在TypeScript中,尽管在对象数组中的可空字段上检查为null(df2.join( df2.groupBy("id").agg(sum($"occurences") as "total"), Seq("id") ).select( $"*", ($"total" - $"occurences") as "other_occurences_sum" ).show // +---+----+----------+--------------------+ // | id|item|occurences|other_occurences_sum| // +---+----+----------+--------------------+ // | 0|car3| 2| 3| // | 0|car2| 1| 4| // | 0|car1| 2| 3| // | 1|car2| 1| 1| // | 1|car1| 1| 1| // +---+----+----------+--------------------+ 设置为strictNullCheck),编译器仍然抱怨对象可能未定义&#39 ;。请考虑以下事项:

true

Link到TS PlayGround(设置interface IA { d?: Date } const arr : IA[] = [{d: new Date()}]; console.error(arr[0].d == null ? "" : arr[0].d.toString()); // ^ complains that "Object is possibly 'undefined'

但是,如果我们有:

strictNullCheck

然后编译器很高兴。

为什么这是理想的行为?如果我不想让const a : IA = {d: new Date()}; console.error(a.d == null ? "" : a.d.toString()); 关闭,那么这里的正确做法是什么?

1 个答案:

答案 0 :(得分:5)

TypeScript不会按索引跟踪数组元素;换句话说,类型系统中没有机制可以识别两个表达式arr[0]必然指向同一个对象。

一般来说,这是一个很好的假设,因为数组元素的排序保证在同一元素的任何两个观察之间保持相同。我们可以从检查中看出,例如你没有在这两次访问之间调用sort,但在任何其他情况下,两个表达式不会一个接一个地进行求值,我不确定arr[0]是否同时指向同一个对象