【问题标题】:Allow nullable operands in less- or greater-than comparisons in TypeScript在 TypeScript 的小于或大于比较中允许可空操作数
【发布时间】:2020-04-15 17:28:04
【问题描述】:

在 JavaScript 中,null operands in a relational expression are treated as 0:

function f() { return /* either a number or null */; }

let b = f() < 0; // false if f() returns null

但在 TypeScript 中,如果我为 f 提供类型注释并打开严格的空值检查,则会收到编译器错误 Object is possibly 'null'

function f(): number | null { return /* either a number or null */; }

let b = f() < 0; // <-- error TS2531

有没有办法告诉编译器这里可以接受可空操作数?

我可以在f() 上使用非空断言关闭编译器,但我担心f()! 可能会误导代码审阅者,因为f() 可以在这里返回空值。

【问题讨论】:

    标签: typescript relational-operators strictnullchecks


    【解决方案1】:

    nonNumber &lt; number 回复 javascript 类型强制工作(与数字相比时将 null 转换为 number)。由于值转换的方式不明显,类型强制被广泛认为是所有 javascript 程序中应避免的事情。

    Typescript 通常假设比较中使用的可为空的数字可能是一个潜在的错误。很可能程序员在编写比较时忘记了变量可能是null

    所以 typescript 想要你明确地处理 null 的情况。如果该值为 null 并且原始程序员打算以这种方式精确处理 null,这将准确地告诉您的代码的读者会发生什么。

    大概是这样的吧?

    const val = f()
    let b = val !== null && val < 0
    

    或:

    let b = (f() ?? 0) < 0
    

    您可以使用f()!,正如您所指出的那样,这应该可以消除错误。然而,! 的意思是说“程序员在这里断言这个值不是null,即使编译器认为它可能是”。正如您已经指出的那样,这不太准确。

    【讨论】:

    • 听起来很合理。我也考虑过更简洁的(f() || 0) &lt; 0,但是空检查不是很明显。
    • 使用new ?? operator 使这一点更明显,它正在检查null 然后(f() ?? 0) &lt; 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多