Hegel:励志成为最好的 JavaScript 静态类型检查器

简介: Hegel 作为 JavaScript 类型检查器中的新秀,励志要成为最好的 JavaScript 静态类型检查器。它宣称提供了一个具备强类型推断的可靠的类型系统。目前 Hegel 还在 alpha 测试阶段,大家可以在其提供的专用在线练习场进行功能体验。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

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

相关文章
|
2月前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
15 0
|
2月前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
10天前
|
JavaScript 前端开发
JavaScript中的布尔类型与数字类型详解
JavaScript中的布尔类型与数字类型详解
12 0
|
2月前
|
JavaScript 前端开发 安全
使用TypeScript增强JavaScript应用的类型安全性
【5月更文挑战第23天】TypeScript是微软开发的JavaScript超集,引入静态类型检查和面向对象特性,提升代码可维护性和可靠性。它在编译阶段捕获类型错误,增强代码可读性,并通过接口、类、泛型和类型断言等工具确保类型安全。使用TypeScript能有效避免复杂项目中的调试难题,尤其适合大型项目。
|
10天前
|
JavaScript 前端开发
JS的静态类型检测,有内味儿了
JS的静态类型检测,有内味儿了
|
13天前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
14 2
|
3天前
|
JavaScript
JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
|
27天前
|
前端开发 JavaScript 安全
TypeScript作为一种静态类型的JavaScript超集,其强大的类型系统和面向对象编程特性为微前端架构的实现提供了有力的支持
【6月更文挑战第11天】微前端架构借助TypeScript提升开发效率和代码可靠性。 TypeScript提供类型安全,防止微前端间通信出错;智能提示和自动补全加速跨代码库开发;重构支持简化代码更新。通过定义公共接口确保一致性,用TypeScript编写微前端以保证质量。集成到构建流程确保顺利构建打包。在微前端场景中,TypeScript是强有力的语言选择。
32 2
|
5天前
|
JavaScript 前端开发 安全
JavaScript数据类型与类型判断
【7月更文挑战第1天】JavaScript基础涉及多种数据类型,如字符串、数字、布尔值、undefined、null、Symbol和BigInt(ES新特性)。对象、数组和函数属于引用类型。类型判断可通过typeof(不准确判断null和Array)、instanceof(检查原型链)和Object.prototype.toString方法。理解这些对编写健壮的代码至关重要。
8 0
|
2月前
|
存储 JavaScript 前端开发
JavaScript 中松散类型的理解
JavaScript 中松散类型的理解
16 1