允许在 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"。正如您已经指出的那样,这不太准确。
在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"。正如您已经指出的那样,这不太准确。