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 Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
Jan 11 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
Feb 07 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
深入浅析JavaScript中的3DES
Aug 24 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
Canvas实现放射线动画效果
Feb 15 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
JavaScript实现数字前补“0”的五种方法示例
Jan 03 Javascript
如何在selenium中使用js实现定位
Aug 18 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
Sep 02 Javascript
React倒计时功能实现代码——解耦通用
Sep 18 Javascript
Vue+Flask实现图片传输功能
Apr 01 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 无法载入mysql扩展
2010/03/12 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
javascript dom追加内容实现示例
2013/09/21 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
python使用7z解压apk包的方法
2015/04/18 Python
python获取本地计算机名字的方法
2015/04/29 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
学生自我鉴定
2013/12/18 职场文书
师范毕业生自我鉴定
2014/01/15 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
关于读书的演讲稿
2014/05/07 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
催款律师函范文
2015/05/27 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS