JavaScript 和 TypeScript 中的 void

原文:fettblog.eu/void-in-jav…
譯文:塗鴉碼龍javascript

若是寫過強類型語言,會比較熟悉 void 的概念:調用函數和方法的時候,什麼也不返回。java

JavaScript 中的 void 是操做符,TypeScript 中的 void 是基本類型。void 在兩個環境中的表現有所不一樣。git

JavaScript 中的 void

JavaScript 中的 void 是操做符,能夠執行表達式。不關心表達式執行結果,void 老是返回 undefinedgithub

let i = void 2; // i === undefined
複製代碼

那爲何須要它呢?首先,早期咱們能夠覆蓋 undefined,給出確切的值。void 老是返回真正的 undefinedtypescript

其次,它是調用當即執行函數的好法子:安全

void function() {
  console.log('What')
}()
複製代碼

不會污染全局命名空間:app

void function aRecursion(i) {
  if(i > 0) {
    console.log(i--)
    aRecursion(i)
  }
}(3)

console.log(typeof aRecursion) // undefined
複製代碼

因爲 void 老是返回 undefinedvoid 總會執行緊隨其後的表達式,有一個很便利的方法能夠作到,函數沒有返回任何值,可是仍然調用了 callback:函數

// 返回其它值,app 會崩潰
function middleware(nextCallback) {
  if(conditionApplies()) {
    return void nextCallback();
  }
}
複製代碼

對我而言,void 最重要的做用是 app 的保安閘。既然函數默認返回 undefined,咱們也能夠明確地定義它。ui

button.onclick = () => void doSomething();
複製代碼

TypeScript 中的 void

TypeScript 中的 voidundefined 的子類型。JavaScript 中的函數總會返回一個值,或者 undefinedspa

function iHaveNoReturnValue(i) {
  console.log(i)
} // 返回 undefined
複製代碼

沒有返回值的函數老是返回 undefined,JavaScript 中的 void 老是返回 undefined,TypeScript 中的 void 是個合適的類型,代表函數返回 undefined

declare function iHaveNoReturnValue(i: number): void 複製代碼

void 能夠用於參數或者其餘的聲明,只有 undefined 能夠傳:

declare function iTakeNoParameters(x: void): void iTakeNoParameters() // 👍 iTakeNoParameters(undefined) // 👍 iTakeNoParameters(void 2) // 👍 複製代碼

因此 voidundefined 幾乎同樣。有一點點不一樣的是:void 做爲返回類型,能夠用不一樣的類型替代,容許高級回調模式:

function doSomething(callback: () => void) {
  let c = callback() // 此處,callback 老是返回 undefined
  // c 也是 undefiend 類型
}

// 函數返回 number 類型
function aNumberCallback(): number {
  return 2;
}

// 👍 類型安全在 doSometing 中獲得保證
doSomething(aNumberCallback) 
複製代碼

這種指望的行爲經常使用於 JavaScript 應用。可置換性的模式能夠閱讀個人其餘文章。

若是想確保傳入的函數只返回 undefined,須要修改 callback 的類型定義:

- function doSomething(callback: () => void) {
+ function doSomething(callback: () => undefined) { /* ... */ }

function aNumberCallback(): number { return 2; }

// 💥 類型不匹配
doSomething(aNumberCallback) 
複製代碼
相關文章
相關標籤/搜索