近日,微软宣布了一个雄心勃勃的项目 —— 正在支持并合作一项初始“阶段 0 ”的提案:将可选的 Type Annotations(类型标注)添加到官方 JavaScript 标准 ECMAScript 里面。
据微软官方信息显示:“该提议旨在使开发人员能够向 JavaScript 代码中添加类型标注,允许 JavaScript 外部的类型检查器检查这些注释,且在运行时,JavaScript 引擎会忽略它们,将类型视为标注。”
以上提议的目的是让开发者能够在不进行任何编译的情况下就能运行用 TypeScript、Flow 及其他静态类型的 JavaScript “超集”编写的程序(如果它们停留在语言的某个相当大的子集内的话)。
3 月 9 日,在 TypeScript 高级项目经理、微软 Daniel Rosenwasser 撰写的一篇博客文章中,对以上提案进行了全面解释。如果该提案继续往前推进的话,可能需要数年时间。
博文中解释称,此次提案与最近的趋势有关,即更快的 JavaScript 迭代、更少的构建步骤,这些趋势都正在使 JavaScript 编码变得更快、更简单。同时,这一趋势也得到了现代 evergreen 浏览器的推动,这些浏览器通常不再要求开发人员编译新版本的 JavaScript,以便在较旧的运行时上运行。
正如前面的建议所指出的,本次提案中语法的作用类似于注释,因此不会影响周围代码的运行方式。这一点在上面 Daniel Rosenwasser 的博文中也有所解释:
“这个提议的想法是,JavaScript 可以为引擎完全忽略的类型创建一组语法,但 TypeScript、Flow 等工具可以使用这些语法”,“这使我们能够保留开发者喜欢的 TypeScript 的东西——它的类型检查和编辑体验,同时消除开发中构建步骤的需要。”
在此次新方案中,当涉及到编写和运行代码时,开发人员的内部循环如下图所示:
由于 JavaScript 的 type syntax 之前就已经出现过,且开发人员对任何此类功能的工作方式都有许多不同的看法,因此许多细节还没有具体化。
对此,Daniel Rosenwasser 补充称,至少需要为以下内容添加语法:
- 变量和函数的类型注释
- (可选)modifiers(?)参数和类成员
- 类型声明(接口和类型别名)
- 类型断言运算符(as和!)
尽管可见性 modifiers 等其他构造(如 public、private 和 protected)也可能在范围内,但 enums、 namespaces 及 parameter properties 等其他构造并不在范围内,因为它们具有可观察的运行时行为。
Daniel Rosenwasser 表示,“这些功能可以根据反馈作为单独的 ECMAScript 功能提出,但我们目前的目标是支持 TypeScript 的一些大子集,我们认为这些子集可能是 JavaScript 的一个有价值的补充。”
据悉,该提案将在即将于 2022 年 3 月召开的 TC39(“指定 JavaScript”)全体会议上提出。
TC39 是由 JavaScript 开发人员、实现人员、学者及相关人士共同组成的委员会,他们与社区合作维护和发展 JavaScript 的定义,希望从“第 0 阶段”跳到“第 1 阶段”。
Rosenwasser 强调称:“达到第 1 阶段意味着标准委员会认为支持 type syntax 对于 ECMAScript 是值得考虑的”。“这并非一件肯定会引起轰动的事情,委员会内部有许多有价值的观点,我们确实希望会有一些怀疑。像这样的提案会得到很多反馈和适当的审查,所以它可能会涉及很多设计变更,可能需要数年才能产生结果。”
“但如果我们完成这一切,我们就有机会对 JavaScript 世界做出最有影响力的改进之一。我们对此感到兴奋,希望你们也感到兴奋。”