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) 
复制代码
相关文章
相关标签/搜索