typescript - 偵測函數返回 `void`(而不是 `undefined`)
我聽說有一個傳言說 void 意味著 null|undefined。畢竟,這段代碼是合法的:
var x: void = undefined, y: void = null;
但我遇到了一個違背這種理解的問題。
編輯: 當我重新啟動 Visual Studio Code 後,問題消失了。原來下面描述的問題僅在 strictNullChecks 關閉 時才會發生。我使用的是 "strictNullChecks": true,所以我猜是某些因素暫時讓 IDE 混淆了,而令人驚訝的是,更寬鬆的模式竟然會造成新的錯誤。我應該提到,在 strictNullChecks 模式下,var y: void=null 是一個錯誤。這只留下了一個問題:在嚴格模式下,void 和 undefined 有什麼區別?
我想要為一個資料結構定義一個回呼函數,該函數可以返回一個值,但不一定要返回。具體來說,你可以返回{stop:true}來停止迭代。我的程式碼是這樣開始的,但如果函數沒有返回值的情況下,這樣寫是行不通的:
type ForRangeResult = {stop?:boolean} | undefined;
class BTree<K=any,V=any> {
forEach(callback: (k:K, v:V) => ForRangeResult): number { ... }
...
}
// Type 'void' is not assignable to type '{ stop?: boolean; }'.
new BTree().forEach((k,v) => {});
如果我使用,錯誤訊息(本身似乎就是不正確的)就會消失
type ForRangeResult = {stop?:boolean} | void;
但是如果我使用,它就會回來
type ForRangeResult = {stop?:boolean} | undefined | null;
不過,如果我使用 {stop?:boolean} | void,我該如何檢查函數是否返回了 void?通常基於控制流程的類型檢查在這裡不起作用:
var result = callback(keys[i], values[i]);
if (result !== undefined && result !== null) {
// [ts] Property 'stop' does not exist on type 'void'
if (result.stop)
return ...;
}
我傾向於認為這要麼是編譯器的錯誤,要麼是設計不當的決策,但是否有我忽略的簡單修復方法?
tsc --version: 2.9.2(除非 IntelliSense 版本不同)
答案#1
[原始答案]
這種形式的 if 測試可以避免錯誤:
if (result instanceof Object) {
[更好的答案]
if (x !== null && typeof x === 'object') {
如果 x 的類型是 void(未定義),這段程式碼將不會產生編譯器錯誤。
