五年来,Forms 包中的强类型一直是首要的功能需求。 Issue (#13721)是 Angular 存储库上有史以来最受欢迎的问题。多年来,许多贡献者都尝试实施它。
我们很自豪地宣布键入表单征求意见。这是向 Angular 添加这一期待已久的功能迈出的第一步。
使用强类型,可以更安全地访问表单控件、组和数组内部的值。许多用户在第一次与 Forms 交互时访问控件类型,并想知道为什么它的值为any
:
const control = new FormControl(1234);
const value = control.value; // type `any`
这只是冰山一角:Forms API 非常大,并且有许多表面同样是非类型化的。
此外,API 本身也带来了许多挑战,RFC 中对此进行了深入探讨。这些挑战包括如何reset
控件、部分FormGroup
值、 disabled
控件等等的详细信息。
尽管完整的细节在 RFC 中,但探索最棘手的部分之一会带来一些乐趣:重置控件。 Forms 包当前的行为方式非常不安全:控件重置为null
,这可能会违反预期的值类型。例如, FormControl<string>
可能旨在具有字符串值,但调用reset
将导致其变为null
,从而违反了该类型约定。为了解决这个特定问题,我们在构造FormControl
时引入了一个名为initialValueIsDefault
的新选项。设置此标志会导致控件重置为其初始值,而不是null
。
这只是一个例子,许多其他冰山潜伏在表面之下。我们如何以向后兼容的方式输入这些内容?我们研究了这些问题,并在 RFC 中收集了我们提出的修复方案。
RFC 同时服务于几个目的。
首先,它收集我们关于关键设计问题的建议。 RFC 以简洁易懂的方式呈现每个设计点并附有解释和示例。
其次,它提供了一个工作原型。我们希望您尝试我们的原型,尤其是使用您自己的应用程序,并让我们知道它的进展情况。这是您在审核 RFC 时可以帮助我们的最重要方法之一。
最后,我们很乐意收集有关该提案的反馈。我们提出了一些特别有趣的问题,但不要觉得仅限于这些主题。
类型化表单本身提供了宝贵的好处,但该功能还将使我们能够以其他方式改进表单包。
下一步是改进模板类型检查。现在我们可以在 TypeScript 中检查表单类的类型,我们也希望将这些改进引入表单模板中。这将需要升级模板类型检查器,并且应该很好地扩大新类型的影响。
还有一些其他潜在的受益者:我们很乐意清理状态更改事件的处理方式。拥有强类型将使我们能够在任何地方提供一致且正确的体验,从ControlValueAccessor
到AbstractControl
上的可观察量。
我们对表单的这一新方向感到非常兴奋,无论是类型本身还是即将到来的许多改进。
原文链接:https://blog.angular.dev/typed-forms-the-rfc-is-here-53263e792c89