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 相关文章推荐
多个表单中如何获得这个文件上传的网址实现js代码
Mar 25 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
Apr 19 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
JavaScript简单下拉菜单实例代码
Sep 07 Javascript
辨析JavaScript中的Undefined类型与null类型
May 26 Javascript
正则中的回溯定义与用法分析【JS与java实现】
Dec 27 Javascript
如何提高Dom访问速度
Jan 05 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
Jan 11 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
Feb 10 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
Jun 19 Javascript
Vuex实现数据共享的方法
Dec 20 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编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
Python 正则表达式操作指南
2009/05/04 Python
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
在Django框架中编写Contact表单的教程
2015/07/17 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
工程地质勘察专业大学生求职信
2013/10/13 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
安全协议书
2014/04/23 职场文书
应届大专生求职信
2014/06/26 职场文书
作弊检讨书范文
2015/05/06 职场文书
思品教学工作总结
2015/08/10 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python