大家好,我是Kason。最近,Typescriptv5.0beta[1]发布了,主要特性是“支持装饰器”。有的同学会疑惑,Decorators不是一个由来已久的特性吗?各种框架(比如Nest.js、Angular)用了很久,ts早就支持了?产生这样疑惑的原因很简单,现阶段大家都在使用旧的Decorators规范,需要加上--experimentalDecorators标志才能在ts中使用。2022年3月ts的更新支持新的Decorator规范,这背后更本质的原因涉及新JS语法的诞生过程。今天,我们就以Decorators为例,谈谈一种新的JS语法是如何诞生的。新特性是如何产生的所有ES语法的诞生都是由国际标准化组织EcmaInternational[2]下属的TC39(第39届技术委员会)委员会负责的。这是一个会员制组织,由加入会员的公司和组织选出的代表组成。这些代表通常是JS开发者、学者,或者是编程语言领域的专家(比如大家熟悉的“何老”)。360、阿里巴巴、华为、SujiTech等国内企业都参与了TC39。委员会定期召开会议,推动新ES语法的实施。这套语法登陆程序称为TheTC39Process[3]。值得一提的是,这个过程起源于ES2015[4],也就是大名鼎鼎的ES6。ES2015整个版本的实现历时6年,包含了大量的新特性。我想这也是为什么说到ES的新特性,很多同学首先会想到ES2015(也就是ES6)。从ES2017开始,每年都会发布一个新版本,包括那些通过了TheTC39Process而在之前的版本中没有发布的特性。TheTC39Process的整个过程包括5个阶段,阶段0到阶段4。下面简单介绍一下每个阶段的目标。Phase0:稻草人(Strawperson)Phase0称为稻草人(Scarecrow),由TC39成员发起,通常提出新的想法或修改尚未正式收录的提案。例如Decorator提案[5]是由“YehudaKatz”于2014年4月10日提出的,当这个提案进行到第3阶段时,也就是2022年3月了。可想而知创建一个新的feature是多么的困难。Phase1:ProposalPhase1称为提案(Proposal),此时提案已经成为正式提案。这个阶段主要是提出一些具体的问题和解决方案。此时,选举出一个TC39成员(通常是提案的发起者)来推动该提案。继续Decorator提案的例子,他在2015年3月24日到达了phase1。这个阶段[6]指定了Decorator:设计目的的适用范围,例如适用于类本身:@F("color")@GclassFoo{}适用于类方法:classFoo{@F("color")@Gbar(){}}此外,它还可以适用于类访问器属性(getters、setters)、object文字和对象访问器属性。在Decorator进入第一阶段一个月后,Babel跟进了Decorator的polyfill实现。这个版本的polyfill被称为legacy。我们在Babel官网上可以看到Decorator特性有5个选项:不同版本的选项对应Decorator提案不同阶段的执行时间。有不同的选择。类似的原因,ts中也支持不同版本的Decorator,这也是我们开头提到的问题的本质原因。第2阶段:草案第2阶段称为草案。在这个阶段,将使用ES语法尽可能准确地描述提案的语法、语义和API,并提供一个实验性的实现。现阶段,意味着该提案将大概率出现在ES正式版中。Decorator在2016年7月28日到达Phase2,比Phase1晚了一年多。Phase3:CandidatePhase3称为Candidate。在此阶段,该提案已基本完成,仅根据外部反馈对关键问题进行了更改。ts在最新的v5.0beta版本中默认支持的Decorator是stage3。Phase4:FinishedPhase4叫做Finished。该提案将出现在正式的规范文档中,并将在下一版本的ES中得到正式支持。总结语言特性的进步是一个漫长的过程,最终达成的结果是多方博弈的结果。对于ES来说,这些游戏体现在这四个阶段。还是以Decorator为例,这个特性是oop框架(如Angular、Mobx)中非常重要的特性。Angular团队在实现Angular2时,最初考虑使用AtScript。最终Angular是用ts实现的,其中一个最重要的原因是ts团队承诺会实现一些AtScript的特性,尤其是Decorator。参考资料[1]Typescriptv5.0beta:https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/。[2]Ecma国际:https://www.ecma-international.org/。[3]TC39流程:https://tc39.es/process-document/。[4]ES2015:https://262.ecma-international.org/6.0/。[5]装饰者提案:https://github.com/tc39/notes/blob/main/meetings/2014-04/apr-10.md。[6]本阶段:https://github.com/wycats/javascript-decorators。
