在 TypeScript 中允许在小于或大于比较中使用可为空的操作数



在 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此值,即使编译器认为可能是"。正如您已经指出的,这不太准确。

相关内容

  • 没有找到相关文章

最新更新