JavaScript和TypeScript中的void的具体使用


Posted in Javascript onSeptember 12, 2019

如果你来自传统的强类型语言,可能会很熟悉 void 的概念:一种类型,告诉你函数和方法在调用时不返回任何内容。

void 作为运算符存在于 JavaScript 中,而作为基本类型存在于 TypeScript 中。在这两个世界中,void 的工作机制与大多数人习惯的有点不同。

JavaScript 中的 void

JavaScript 中的 void 是一个运算符,用于计算它旁边的表达式。无论评估哪个表达式,void总是返回undefined。

let i = void 2; // i === undefined

我们为什么需要这样的东西?首先在早期,人们能够覆盖 undefined 并给它一个实际值。 void 总是返回 real undefined。

其次,这是一种调用立即调用函数的好方法:

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 app
function middleware(nextCallback) {
 if(conditionApplies()) {
  return void nextCallback();
 }
}

这让我想到了 void 最重要的通途:它是你程序的安全门。当你的函数总是应该返回 undefined 时,你可以确保始终如此。

button.onclick = () => void doSomething();

TypeScript 中的 void

TypeScript 中的 void 是 undefined 的子类型。 JavaScript 中的函数总是返回一些东西。要么它是一个值,要么是 undefined:

function iHaveNoReturnValue(i) {
 console.log(i)
} // returns undefined

因为没有返回值的函数总是返回 undefined,而 void 总是在 JavaScript 中返回 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() // at this position, callback always returns undefined
 //c is also of type undefiend
}

// this function returns a number
function aNumberCallback(): number {
 return 2;
}

// works ? type safety is ensured in doSometing
doSomething(aNumberCallback)

这是期望的行为,通常用于 JavaScript 程序。你可以在我的其他文章中阅读更多关于这种被称为 substitutability 的模式。

如果你想确保传递只返回 undefined 的函数(如“nothing”),请确保调整你的回调方法签名:

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

function aNumberCallback(): number { return 2; }

// ? types don't match
doSomething(aNumberCallback)

大概大部分时间你都能和 void 很好的相处。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
Jun 23 Javascript
基于Node.js实现nodemailer邮件发送
Jan 26 Javascript
总结javascript中的六种迭代器
Aug 16 Javascript
AngularJS自定义控件实例详解
Dec 13 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 Javascript
基于dataset的使用和图片延时加载的实现方法
Dec 11 Javascript
vue页面切换到滚动页面显示顶部的实例
Mar 13 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
Oct 12 Javascript
使用puppeteer爬取网站并抓出404无效链接
Dec 20 Javascript
实现elementUI表单的全局验证的方法步骤
Apr 29 Javascript
解决Element中el-date-picker组件不回填的情况
Nov 07 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 #Javascript
基于JavaScript 实现拖放功能
Sep 12 #Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
Sep 12 #Javascript
layui 对table中的数据进行转义的实例
Sep 12 #Javascript
layui点击数据表格添加或删除一行的例子
Sep 12 #Javascript
小程序如何支持使用 async/await详解
Sep 12 #Javascript
layui清空,重置表单数据的实例
Sep 12 #Javascript
You might like
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
JS实现div居中示例
2014/04/17 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
Python异常处理操作实例详解
2018/08/28 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
Python同时处理多个异常的方法
2020/07/28 Python
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
个人求职信范文分享
2013/12/13 职场文书
应届毕业生求职信范例分享
2013/12/17 职场文书
银行门卫岗位职责
2013/12/29 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
小学优秀学生评语
2014/12/29 职场文书
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫