在 JavaScript 中,关系表达式中的空操作数被视为 0:
function f() { return /* either a number or null */; }
let b = f() < 0; // false if f() returns null
但是在 TypeScript 中,如果我为f
提供类型注释并打开严格的 null 检查,则我会收到编译器错误Object is possibly '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
变量。
所以打字稿想要的是让你明确地处理null
的情况。这准确地告诉代码的读者,如果该值null
会发生什么,并且原始程序员打算null
精确地以这种方式处理。
也许是这样的东西?
const val = f()
let b = val !== null && val < 0
或:
let b = (f() ?? 0) < 0
您可以按照您的笔记使用f()!
,这应该可以消除错误。但是,!
旨在说"程序员断言此处不null
此值,即使编译器认为可能是"。正如您已经指出的,这不太准确。