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入门·图片对象(无刷新变换图片)\滚动图像
Oct 01 Javascript
Extjs学习笔记之七 布局
Jan 08 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
Dec 28 Javascript
js 判断浏览器使用的语言示例代码
Mar 22 Javascript
JS案例分享之金额小写转大写
May 15 Javascript
JavaScript常用小技巧小结
Dec 29 Javascript
JavaScript创建一个object对象并操作对象属性的用法
Mar 23 Javascript
简单的jQuery入门指引
Jul 28 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
js放到head中失效的原因与解决方法
Mar 07 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
Nov 13 Javascript
通过js给网页加上水印背景实例
Jun 17 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绘制一个矩形的方法
2015/01/24 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
解释&&和||在javascript中的另类用法
2014/07/28 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
python 实时遍历日志文件
2016/04/12 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
教师一岗双责责任书
2014/04/16 职场文书
法律专业自荐信
2014/06/03 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
村官2015年度工作总结
2015/10/14 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
Redis实战高并发之扣减库存项目
2022/04/14 Redis
httpclient调用远程接口的方法
2022/08/14 Java/Android