【问题标题】:TypeScript strict null check on field of object in arrayTypeScript对数组中对象的字段进行严格的空检查
【发布时间】:2018-04-21 22:13:13
【问题描述】:

在 TypeScript 中,尽管在对象数组中的可空字段上检查 null(strictNullCheck 设置为 true),编译器仍然抱怨“对象可能未定义”。考虑以下几点:

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'

Link 到 TS PlayGround(设置 strictNullCheck 开启)

但是,如果我们有:

const a : IA = {d: new Date()};
console.error(a.d == null ? "" : a.d.toString());

那么编译器就开心了。

为什么这是期望的行为?如果我不想关闭strictNullCheck,那么正确的做法是什么?

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

    一般来说,这是一个很好的假设,因为数组元素的顺序保证在同一元素的任何两个观察值之间保持相同。我们可以从检查中得知,例如您没有在这两次访问之间调用 sort,但在任何其他情况下,如果两个表达式没有在另一个之后立即进行评估,则无法确定 arr[0] 两次都指向同一个对象。

    【讨论】:

    • 谢谢,但是这里的表达式 一个接一个地被评估,所以我只是错过了为什么这与 var 不同的点(这也可以被嵌套函数等改变)
    • 知道,但 TypeScript 并没有实现特殊情况来识别这种情况
    • 好的,还没有完全理解,但也许这不是目标.. 那么这里推荐的做法是什么(如果我不想压制strictNullCheck)?
    • 解压到const或使用后缀!操作符(arr[0].d!.toString())
    • 如果您对 TS 工作原理的心智模型是“一组启发式和跟踪规则识别两个表达式何时解析为同一个对象”而不是“TS 从一个完美的宇宙并故意丢弃数据”
    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 2017-04-25
    • 2021-12-03
    • 2021-01-11
    • 2022-01-17
    • 2018-09-29
    • 2021-05-02
    • 2019-03-23
    相关资源
    最近更新 更多