原文:fettblog.eu/void-in-jav…
译文:涂鸦码龙javascript
若是写过强类型语言,会比较熟悉 void
的概念:调用函数和方法的时候,什么也不返回。java
JavaScript 中的 void
是操做符,TypeScript 中的 void
是基本类型。void
在两个环境中的表现有所不一样。git
void
JavaScript 中的 void
是操做符,能够执行表达式。不关心表达式执行结果,void
老是返回 undefined
github
let i = void 2; // i === undefined
复制代码
那为何须要它呢?首先,早期咱们能够覆盖 undefined
,给出确切的值。void
老是返回真正的 undefined
。typescript
其次,它是调用当即执行函数的好法子:安全
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
老是返回 undefined
,void
总会执行紧随其后的表达式,有一个很便利的方法能够作到,函数没有返回任何值,可是仍然调用了 callback:函数
// 返回其它值,app 会崩溃
function middleware(nextCallback) {
if(conditionApplies()) {
return void nextCallback();
}
}
复制代码
对我而言,void
最重要的做用是 app 的保安闸。既然函数默认返回 undefined
,咱们也能够明确地定义它。ui
button.onclick = () => void doSomething();
复制代码
void
TypeScript 中的 void
是 undefined
的子类型。JavaScript 中的函数总会返回一个值,或者 undefined
。spa
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) // 👍 复制代码
因此 void
和 undefined
几乎同样。有一点点不一样的是: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)
复制代码