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的.animate()函数在IE6下的问题
Dec 03 Javascript
JQuery live函数
Dec 24 Javascript
实现图片预加载的三大方法及优缺点分析
Nov 19 Javascript
jQuery中:last-child选择器用法实例
Dec 31 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
Mar 23 Javascript
jQuery实现的网页竖向菜单效果代码
Aug 26 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
Dec 04 Javascript
模板视图和AngularJS之间冲突的解决方法
Nov 22 Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 Javascript
javaScript中indexOf用法技巧
Nov 26 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
微信小程序页面调用自定义组件内的事件详解
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连接mssql的一些相关经验及注意事项
2013/02/05 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
javascript instanceof,typeof的区别
2010/03/24 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
Python提取网页中超链接的方法
2016/09/18 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
电子专业推荐信范文
2013/11/18 职场文书
市场部专员岗位职责
2013/11/30 职场文书
团队口号大全
2014/06/06 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
人口与计划生育责任书
2015/05/09 职场文书
工资证明范本
2015/06/12 职场文书
MySQL 常见存储引擎的优劣
2021/06/02 MySQL
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python