原文地址:https://fettblog.eu/void-in-javascript-and-typescript/
原文标题:void in JavaScript and TypeScript
- 正文开始 -
如果你是从传统的强类型语言转到JavaScript来的,那么你可能熟悉void的概念:一种类型,它告诉你函数和方法在调用时不返回任何内容。
void
在JavaScript中作为运算符存在,在TypeScript中作为基本类型存在。在JS和TS中,void
的用法和大多数人习惯的有所不同。
JavaScript中的void
JS中的void
是一个运算符,它对紧跟其后的表达式求值。不管是什么表达式,void
总是返回undefined
。
let i = void 2; // i === undefined
为什么我们需要这么写?这是因为在早些时候,人们可以重写undefined
,并且给它一个特定的值。void
总是返回真正的undefined
。
另外,void
是一种调用立即执行函数的不错的方式。
void function() { console.log('What')}()
可以避免污染全局命名空间:
void function aRecursion(i) { if(i > 0) { console.log(i--) aRecursion(i) }}(3) console.log(typeof aRecursion) // undefined
由于void
总是返回undefined
,并且void
总是会对表达式求值,所以有一个非常简单的方法,从函数返回而不返回值,但是仍然调用回调函数:
// returning something else than undefined would crash the appfunction middleware(nextCallback) { if(conditionApplies()) { return void nextCallback(); }}
我认为,void
最重要的用法:因为void
总是返回undefined
,他是你app安全的守护者。
button.onclick = () => void doSomething();
TypeScript中的void
TypeScript中的void
是undefined
的子类型。JS中的函数总会有返回,要么是一个具体的值,要么是undefined
.
function iHaveNoReturnValue(i) { console.log(i)} // returns undefined
在JS中,如果没有具体的返回值的函数会返回undefined
,并且void
总是会返回undefined
,TS中的void
是y一个合适的类型,告诉开发人员此函数返回undefined
:
declare function iHaveNoReturnValue(i: number): void
void
作为一个类型,也可以用在函数参数和其他的声明上。唯一可以传入的值是void
:
declare function iTakeNoParameters(x: void): void iTakeNoParameters() // 👍iTakeNoParameters(undefined) // 👍iTakeNoParameters(void 2) // 👍
void
和undefined
几乎是一样的。但是还是有一点不同,这个区别是十分重要的:
void
作为返回类型可以用不同的类型替换,以允许高级回调模式:
function doSomething(callback: () => void) { let c = callback() // at this position, callback always returns undefined //c is also of type undefiend} // this function returns a numberfunction aNumberCallback(): number { return 2;} // works 👍 type safety is ensured in doSometingdoSomething(aNumberCallback)
如果你想确保只能传入返回undefined
的函数,调整你的回调函数类型:
- function doSomething(callback: () => void) {+ function doSomething(callback: () => undefined) { /* ... */ } function aNumberCallback(): number { return 2; } // 💥 types don't matchdoSomething(aNumberCallback)
现在,在大多数时候,你都可以很好的处理void了。
- 正文结束 -