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 相关文章推荐
JavaScript confirm选择判断
Oct 18 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
Jun 04 Javascript
30分钟就入门的正则表达式基础教程
Feb 25 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
Apr 09 Javascript
node.js中的fs.appendFile方法使用说明
Dec 17 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
Jun 16 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
Apr 29 jQuery
浅谈原型对象的常用开发模式
Jul 22 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 Javascript
详解JSON.parse和JSON.stringify用法
Feb 18 Javascript
javascript进阶篇深拷贝实现的四种方式
Jul 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中Date获取时间不正确怎么办
2008/06/05 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
jquery.validate分组验证代码
2011/03/17 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
五步轻松实现zTree的使用
2017/11/01 Javascript
Three.js基础学习教程
2017/11/16 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
wxPython之解决闪烁的问题
2018/01/15 Python
python删除服务器文件代码示例
2018/02/09 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
python中实现词云图的示例
2020/12/19 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
运动会横幅标语
2014/06/17 职场文书
教师求职简历自我评价
2015/03/10 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python