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实现简单模态窗口,背景灰显
Nov 14 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
Apr 15 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
Mar 20 Javascript
使用隐藏的new来创建对象
Mar 29 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
Jul 01 Javascript
jquery重新播放css动画所遇问题解决
Aug 21 Javascript
JS中typeof与instanceof之间的区别总结
Nov 14 Javascript
文字垂直滚动之javascript代码
Jul 29 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
详解vue2.6插槽更新v-slot用法总结
Mar 09 Javascript
node中使用es6/7/8(支持性与性能)
Mar 28 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中数组的三种排序方法分享
2012/05/07 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
简单实现js进度条加载效果
2020/03/25 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python整数对象实现原理详解
2019/07/01 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
django rest framework 过滤时间操作
2020/07/12 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
高三家长寄语
2014/04/03 职场文书
地球一小时倡议书
2014/04/15 职场文书
总经理聘用协议书
2015/09/21 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python
vue3中provide && inject的使用
2021/07/01 Vue.js