在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());
关闭,那么这里的正确做法是什么?
答案 0 :(得分:5)
TypeScript不会按索引跟踪数组元素;换句话说,类型系统中没有机制可以识别两个表达式arr[0]
必然指向同一个对象。
一般来说,这是一个很好的假设,因为数组元素的排序不保证在同一元素的任何两个观察之间保持相同。我们可以从检查中看出,例如你没有在这两次访问之间调用sort
,但在任何其他情况下,两个表达式不会一个接一个地进行求值,我不确定arr[0]
是否同时指向同一个对象