在 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/