簡體   English   中英

在 TypeScript 中的小於或大於比較中允許可以為空的操作數

[英]Allow nullable operands in less- or greater-than comparisons in TypeScript

在 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

有沒有辦法告訴編譯器這里可以接受可為空的操作數?

我可以用f()上的非空斷言關閉編譯器,但我擔心f()! 可能會誤導代碼審查者,因為f()在這里可以返回 null。

nonNumber < number回復 javascript 類型強制工作(與number相比,將null轉換為數字)。 由於轉換值的方式不明顯,因此類型強制被廣泛認為是所有 javascript 程序中應避免的事情。

Typescript 假設通常情況下,比較中使用的可為空的數字可能是一個潛在的錯誤。 程序員很可能只是在編寫比較時忘記了變量可能為null

所以打字稿想要的是讓你顯式地處理null情況。 這告訴你的代碼的讀者,如果該值是正是發生null和原來的程序員意null進行精確處理的方式。

也許是這樣的?

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

或者:

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

你可以使用f()! 正如您所注意到的,這應該可以消除錯誤。 然而, ! 旨在說“程序員在這里斷言這個值不為null ,即使編譯器認為它可能是”。 正如您已經指出的那樣,這不太准確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM