1

在 JavaScript 中,关系表达式中的空操作数被视为 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

有没有办法告诉编译器这里可以接受可空操作数?

我可以用 on 的非 null 断言关闭编译器f(),但我担心这f()!会误导代码审阅者,因为f() 可以在这里返回 null。

4

1 回答 1

2

nonNumber < number回复 javascript 类型强制工作(与数字相比时转换null为 a number)。由于值转换的不明显方式,类型强制被广泛认为是所有 javascript 程序中应避免的事情。

打字稿通常假设比较中使用的可为空的数字可能是一个潜在的错误。null程序员很可能只是在编写比较时忘记了变量可能是。

所以 typescript 想要的是让你明确地处理这个null案例。这会告诉您的代码的读者,如果该值是null,并且原始程序员打算null以这种方式精确处理,则会发生什么。

大概是这样的?

const val = f()
let b = val !== null && val < 0

或者:

let b = (f() ?? 0) < 0

您可以f()!按照您的说明使用,这应该可以消除错误。然而,它的!意思是“程序员断言这个值不在null这里,即使编译器认为它可能是”。正如您已经指出的那样,这不太准确。

于 2019-12-24T18:26:45.237 回答