允许在 TypeScript 中进行小于或大于比较的可空操作数

Allow nullable operands in less- or greater-than comparisons in TypeScript

在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() 可以 return 此处为空。

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()!,这应该可以消除错误。但是,! 的意思是 "the programmer is asserting that this value is not null here, even if the compiler thinks it might be"。正如您已经指出的那样,这不太准确。