中山公众号开发,中山小程序开发,中山企业官网开发,中山软件开发,中山APP开发
公司动态
COMPANY DYNAMIC
行业资讯
COMPANY DYNAMIC
扫一扫出方案
Hegel:励志成为最好的 JavaScript 静态类型检查器
点击数:
2020-05-29 10:00:33

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<any>类型。 因此健壮的类型推断允许开发人员尽量少的编写代码注释,这样反而更有利于代码的可读性。

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 都不会被忽略和遗忘。

文章版权归极客邦科技 InfoQ 所有

节点互动(广东)科技有限公司一家专注于 APP开发 + 小程序开发 + 微信开发 + 系统开发 + 网站开发 的专业互联网应用服务提供商。5年实战开发经验,高校合作基地,多年行业深耕经验,助力传统行业快速转型,为众多企业提供创新性互联网应用产品。


推荐文章
小程序时代:如何开发一款高性能、跨平台的小程序?
随着各大互联网公司都相继推出了自己的小程序平台,小程序的开发热度也水涨船高。在这个全民小程序的年代,开发者应该如何应对?腾讯 QQ 小程序的前端负责人黄佳琳,即将在 GMTC 全球大前端技术会议(深圳站)与来自腾讯、京东、百度和 360 的前端技术专
Java 25 岁生日快乐
2020 年 5 月 23 日,标志着距离 Java 编程语言和平台的第一个公开 alpha 版本发布已经过去了 25 周年。跟最初版本发布那会儿相比,世界已经发生了很大的变化,那时 Network World 认为“一些分析师相信 Java 编程语
为什么必须将代码从 x86 迁移到 ARM,这篇文章给你答案
“我们非常希望 ARM 和鲲鹏的生态能成为下一个计算产业迭代的方向。”在 6 月 8 日于成都举办的华为 DevRun 开发者沙龙——四川鲲鹏开发者嘉年华上,华为鲲鹏计算产业开源与生态营销总监梁冰对计算产业未来展望道。新基建风口下,算力一跃成为了新的
如何找到靠谱的软件开发团队?
哪里有好的靠谱软件开发团队如今,不少企业都想拥有属于自己企业或产品的手机APP,但其中最困扰企业主的问题就是:开发一款手机APP到底需要多少钱?简单点来说,要视手机APP的需求及质量而言,价位一般在几千到十几万左右,更高端的价格更高。今天,我们就来详
门店差评防不胜防,这样做差评管理可以帮助餐饮品牌变害为利
与其让顾客在公共点评平台上表达不满,不如把差评和抱怨引流到自家平台。现在很多品牌都创建了自己的公众平台以展示自身品牌文化、产品和服务,从而扩大知名度和品牌影响力。其实这种平台可以发挥更大的作用,即成为顾客与企业的即时交流平台。企业可以在自己的公众平台
27 岁程序员转职赏金猎人:一个漏洞 10 万美元,比工资香
Bug 赏金的平均收入是软件工程师平均工资的 2.7 倍,我们鼓励你用业余时间兼职。6 月 1 日,有报道称,印度开发者 Bhavuk Jain 向苹果安全团队报告了 Sign in with Apple(通过 Apple 登录)中存在一个零日漏洞,
移动互联网入口大战:巨头的备战
【摘要】随着科学技术的不断向前发展,各种移动终端设备相继出现,特别是智能手机的使用范围最为广泛。移动互联网也开始赶超传统互联网,并持续表现出巨大的发展潜力,于是传统互联网的商业巨头为了抢占移动互联网的一席之位,纷纷开始备战,百度表现得最明显。随着科学
后疫情时代,农牧产业数字化转型升级新机遇
根据联合国发布的《2020年世界经济形势与展望年中报告》显示,受新冠疫情影响,2020年全球经济预计萎缩3.2%。新加坡国立大学东亚研究所教授郑永年提出疫情之后全球将进入“有限全球化的后疫情时代”。随着疫情的趋缓,“后疫情时代”慢慢展露其面貌,以“数
互联网时代,品牌商要做主角!
受疫情影响,物流不畅,品牌商无法通过原来的形式连接到用户,却意外地发现社区社群这一新路径。不同以往的平台商当主角,或许通过该路径,品牌商能够获得主导互联网商业的机会。没有社区社群,品牌商无法普遍性地连接用户。正如电商连接用户要经过平台一样,2B连接用
一张壁纸使 Android 手机集体变砖,目前尚无解决方法
近日,一名网友在 Twitter 上传了一张壁纸并表示该壁纸会使他的三星手机崩溃。此前已经有日历 Bug 导致三星手机集体崩溃的事情发生,而这一次三星手机再次中招。只因为使用了一张风景壁纸就能导致手机崩溃?经该网友测试,不止是三星,包括谷歌亲儿子 G
在线客服系统