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 相关文章推荐
jQuery学习笔记之jQuery选择器的使用
Dec 22 Javascript
jquery中prop()方法和attr()方法的区别浅析
Sep 06 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
Javascript基础知识(一)核心基础语法与事件模型
Sep 29 Javascript
使用mini-define实现前端代码的模块化管理
Dec 25 Javascript
AngularJS自定义指令实现面包屑功能完整实例
May 17 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
bootstrap fileinput实现文件上传功能
Aug 23 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
Aug 25 Javascript
Vue.js递归组件实现组织架构树和选人功能
Jul 04 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
Aug 12 Javascript
基于JS实现计算24点算法代码实例解析
Jul 23 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预定义常量
2006/12/25 PHP
php中Session的生成机制、回收机制和存储机制探究
2014/08/19 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
python基础教程之常用运算符
2014/08/29 Python
python搜索指定目录的方法
2015/04/29 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
详解用Python实现自动化监控远程服务器
2019/05/18 Python
如何使用python进行pdf文件分割
2019/11/11 Python
python 消费 kafka 数据教程
2019/12/21 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
产品销售员岗位职责
2013/12/18 职场文书
业务员薪酬管理制度
2014/01/15 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
劲霸男装广告词
2014/03/21 职场文书
ktv好的活动方案
2014/08/17 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
员工离职感谢信
2015/01/22 职场文书
2016年元旦主持词
2015/07/06 职场文书
校运会加油稿大全
2015/07/22 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL