typescript - 在 TypeScript 中的小于或大于比较中允许可以为 null 的操作数

标签 typescript relational-operators strictnullchecks

在 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 提供类型注释并打开严格的 null 检查,则会收到编译器错误 Object is possible 'null':

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

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

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

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

最佳答案

nonNumber < 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,即使编译器认为它可能是”。正如您已经指出的那样,这不太准确。

关于typescript - 在 TypeScript 中的小于或大于比较中允许可以为 null 的操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472015/

相关文章:

javascript - 如何在特定数据标签上隐藏 Chart.js 中的工具提示?

typescript - OpenTok 事件 Typescript 输入

node.js - 输入goose + Nestjs + mongodb : index not creating using @index decorator

c++ - 为什么在 C++ 中使用关系运算符创建的模板函数不能正确处理字符串?

typescript 和过滤器 bool 值

javascript - 无法为 typescript 字典赋值

c++ - 具有两个关系运算符的单个变量如何在内部工作

c:这条线是做什么的?

typescript - 类型缩小 : checking variable object key existence when noUncheckedIndexedAccess is true

typescript - 使用严格的 typescript 创建商店