Hegel:励志成为最好的 JavaScript 静态类型检查器
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
Hegel 作为 JavaScript 类型检查器中的新秀,励志要成为最好的 JavaScript 静态类型检查器。它宣称提供了一个具备强类型推断的可靠的类型系统。目前 Hegel 还在 alpha 测试阶段,大家可以在其提供的专用在线练习场进行功能体验。
Hegel 是一个类型注解可选的 JavaScript 类型检查器,同时它和 TypeScript 一样,使用者不需要重新学习一门新的语言结构,只需要掌握注解的语法。Hegel 希望通过强大的、稳定的类型系统,尽量避免程序在运行时由于类型错误产生的异常。下面的代码展示了其强大的类型检查能力:
// 定义 numbers 的类型为 Array<number> const numbers: Array<number> = []; // 将 numbers 变量赋值给 numbersOrStrings, 但其类型为 Array<string | number> // Hegel 会检查出类型错误: // HegelError:类型 "Array<number>" 和类型 "Array<number | string>" 不兼容 const numbersOrStrings: Array<string | number> = numbers; // 给 numbersOrStrings 第二个元素赋值 numbersOrStrings[1] = "Hello, TypeError!"; // 下面的代码 Hegel 会检查出类型异常: // HegelError: 属性 "toFixed" 在 "Number | undefined" 中不存在 numbers[1].toFixed(1);
上面的代码使用 TypeScript(v3.8.3)进行编译时没有任何错误,但是在实际运行时确会抛出异常。
译者注:
JS 运行时,numbers 和 numbersOrStrings 都是引用类型。他们在相互赋值的时候,属于引用赋值。因此 numbersOrStrings 修改元素内容的时候,对 numbers 也同样有效果。所以在执行 numbers[1].toFixed(1) 时候,就会报错,因为字符串没有 toFixed 函数。上面的代码体现了 Hegel 可靠的类型系统。
除了可靠的类型系统,健壮的类型推断也是 Hegel 的主要设计目标。示例代码如下:
// Hegel 会推断 "promisify" 是 "<_q, _c>((_c) => _q) => (_c) => Promise<_q>" const promisify = fn => arg => Promise.resolve(fn(arg)); // 这里,Hegel 会推断为 "<_c>(_c) => Promise<_c>" const id = promisify(x => x) // 同样,"upperStr" 会被推断为 "Promise<string>" const upperStr = id("It will be inferred").then(str => str.toUpperCase() // 最后 "twiceNum" 将会被推断为 "Promise<number>" const twicedNum = id(42).then(num => num ** 2);
而在TypeScript(测试版本:3.7.5)中运行相同的代码时,TS 会识别3 个异常,同时会将变量 result推断为Promise类型。 因此健壮的类型推断允许开发人员尽量少的编写代码注释,这样反而更有利于代码的可读性。
Hegel 将异常也纳入了类型检查中,示例代码如下:
function assert(age) { if (typeof age !== "number") { throw new TypeError("Age is not number."); } if (age <= 0) { throw new ReferenceError("Age can't be less or equals zero."); } } try { assert(0); } catch(error) { // 这里的 "error" 变量,被推断为 "ReferenceError | TypeError | unknown" }
Hegel 的缺点是不支持强制类型转换和any类型,示例如下:
// Error: Hegel 中不存在 any 类型 const something: any = null; // Error: Hegel 中不支持类型转换 (null: any).call();
在 Hegel 文档中说明了其与主流类型检查器(TypeScript 和 Flow)的对比。除了支持标准类型(基础类型、函数、对象、类、数组)之外,Hegel 的类型系统还支持了未知类型(例如由 JSON.parse() 返回的类型)、可选类型、联合类型、元祖类型、类型别名、泛类型和可变类型。这也是 Hegel 的特性之一。
可变类型可以帮助我们从现有类型提取或者创建新类型。因此,可变类型可以理解为从一个类型生成另一个类型的函数。在 Hegel 中,定义了 17 个可变类型。
下面是可变类型 $Exclude (语义上和 TypeScript 中的 Exclude 类型类似)的示例代码:
// 定义类型 type Status = "Ok" | "Failed" | "Pending" | "Canceled"; // 使用 可变类型之后 // IntermediateStatuses = "Canceled" | "Panding" type IntermediateStatuses = $Exclude<Status, "Ok" | "Failed">; // 赋值 const intermediateStatuses: Array<$Exclude<Status, "Ok" | "Failed">> = ["Pending", "Canceled"]; // Hegel 类型检查异常: // Error: 类型 "['Failed']" 和类型 "...Array<'Canceled' | 'Pending'>" 不兼容 intermediateStatuses.push("Failed");
parceljs 的作者,Devon Govett 在 Twitter 上感慨说:
Hegel 看上去很有趣,它比 TS 更接近 Flow,而且是使用 JS 实现的。专注于类型推断和健壮类型,只有 JS 和类型 (没有额外的功能)。支持.d.ts、vscode 集成,等等…。
Hegel 发布在 npm 上,提供了一个命令行工具和一个可交互的在线体验区。同时,其在 GitHub 仓库提供了对应的安装命令,要求 node.js 最低版本为 12。
Hegel 是基于 MIT 协议的。欢迎大家在该项目的 GitHub 上进行反馈和贡献。另外,Hegel 的作者也声明:
Hegel 源于社区,奉献社区;因此,你的任何 PRs 和 issues 都不会被忽略和遗忘。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-29
本文作者: Bruno Couriol
本文来自:“InfoQ”,了解相关信息可以关注“InfoQ”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
这5个有趣的Python库带你花式编码!
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! Python是如今最流行的编程语言之一,这点也给它本身带来很多好处,其中之一就是,为了方便进行程序开发,它拥有了大量优秀的库,如Pandas、Numpy、Matplotlib、SciPy等。 不过,本文不打算介绍那些以实用为主要“卖点”的库,而是带你走进一些极为有趣的库,这些库可以展示Python的另一面,也恰恰证明了Python社区的繁荣发展。 1. Bashplotlib Bashplotlib是一个Python库,使得能够在命令行stdout环境中绘制数据。老实说,第一次看到这个库的时候,笔者很疑惑,我们为什么可能会需要这样的库? 很快笔者就意识到,当没有任何可用的GUI时,它可能会很有用。这个情况可不太常见,它引起了笔者的好奇心。我这是一个非常有趣的Python库。 使用pip就可以很容易地安装Bashplotlib: pipinstall bashplotlib 来看一些例子。在下面的代码中,导入了numpy来生成一些随机数组,当然还有bashplotlib。 importnu...
- 下一篇
ES7学习笔记(十三)GEO位置搜索
ES的基本内容介绍的已经差不多了,最后我们再来看看GEO位置搜索,现在大部分APP都有基于位置搜索的功能,比如:我们点外卖,可以按照离我们的距离进行排序,这样可以节省我们的配送费和送餐的时间;还有找工作时,也可以按照离自己家的距离进行排序,谁都想找个离家近的工作,对吧。这些功能都是基于GEO搜索实现的,目前支持GEO搜索功能的中间件有很多,像MySQL、Redis、ES等。我们看看在ES当中怎么实现GEO位置搜索。 GEO字段的创建 GEO类型的字段是不能使用动态映射自动生成的,我们需要在创建索引时指定字段的类型为geo_point,geo_point类型的字段存储的经纬度,我们看看经纬度是怎么定义的, 英文 简写 正数 负数 维度 latitude lat 北纬 南纬 经度 longitude lon或lng 东经 西经 经度的简写有2个,一般常用的是lon,lng则在第三方地图的开放平台中使用比较多。下面我们先创建一个带有geo_point类型字段的索引,如下: PUT /my_geo { "settings":{ "analysis":{ "analyzer":{ "defaul...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Hadoop3单机部署,实现最简伪集群
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- CentOS8安装Docker,最新的服务器搭配容器使用