如果你使用过传统的强类型语言,你可能对void的概念很熟悉:一种告诉你函数和方法在调用时不返回任何东西的类型。void在JavaScript中作为运算符存在,在TypeScript中作为原始类型存在。在这两个世界中,void的工作方式与大多数人习惯的方式略有不同。JavaScript中的voidJavaScript中的void是计算其旁边表达式的运算符。无论计算哪个表达式,void总是返回undefined。leti=void2;//i===undefined为什么我们需要这样的东西?首先在早期,人们能够重写undefined并赋予它一个实际值。void总是返回真正的未定义。其次,这是调用立即调用函数的好方法:voidfunction(){console.log('What')}()都不会污染全局命名空间:voidfunctionaRecursion(i){if(i>0){console.log(i--)aRecursion(i)}}(3)console.log(typeofaRecursion)//undefined由于void总是返回undefined并且void总是计算它旁边的表达式,所以你有一个非常简洁的方法从函数返回而不返回一个值,但仍然调用回调例如://返回未定义以外的东西会使程序崩溃程序的安全门。当您的函数应始终返回undefined时,您可以确保它始终如此。button.onclick=()=>voiddoSomething();TypeScript中的voidTypeScript中的void是undefined的子类型。JavaScript中的函数总是返回一些东西。要么是一个值,要么是undefined:functioniHaveNoReturnValue(i){console.log(i)}//returnsundefined因为不返回值的函数总是返回undefined,而void在JavaScript中总是返回undefined,在TypeScript中void是一个正确的类型,告诉开发人员此函数返回未定义:declarefunctioniHaveNoReturnValue(i:number):voidvoidastype也可用于参数和所有其他声明。唯一可以传递的值是未定义的:declarefunctioniTakeNoParameters(x:void):voidiTakeNoParameters()//👍iTakeNoParameters(undefined)//👍iTakeNoParameters(void2)//👍所以void和undefined几乎是一样的。有细微差别,但差别很大:void作为返回类型可以替换为不同的类型以允许高级回调模式:functiondoSomething(callback:()=>void){letc=callback()//inthis位置,回调总是返回undefined//c也是undefined类型}//这个函数返回一个数字functionaNumberCallback():number{return2;}//valid👍在doSometing中确保类型安全doSomething(aNumberCallback)这是预期的行为,通常用于JavaScript程序中。您可以在我的另一篇文章中详细了解这种称为可替代性的模式。如果你想确保传递只返回未定义(如“无”)的函数,请确保调整你的回调方法签名:-functiondoSomething(callback:()=>void){+functiondoSomething(callback:()=>undefined){/*...*/}functionaNumberCallback():number{return2;}//💥typemismatchdoSomething(aNumberCallback)可能大多数时候你可以和void相处得很好。
