FormControl / FormGroup / FormArray值类型

时间:2017-01-24 14:36:05

标签: angular typescript reactive-forms

我希望我的FormControlFormGroup / FormArray)是强类型的,所以当我有这样的时候。

interface SomeSource {
  id: string;
  name: string;
}

我把它变成了例如。

let form = new FormGroup<SomeSource>({
  id: new FormControl('test id'),
  name1: new FormControl('test name')
});

TypeScript引发了错误:name上找不到FormGroup

同样在理想世界中,form.value应为SomeSource类型(而不是any)。

问题是没有办法为任何AbstractFormControl孩子指定这种通用类型。

我认为使用自己的界面覆盖FormGroup相当容易。但是,有没有办法实现这个只是使用Angular?如果不是,是否有第三方解决方案?

动机:我想轻松重构我的SomeSource。目前,当我重构SomeSource接口时,表单不适应并且不会抛出错误=&gt;有一些错误的空间。

1 个答案:

答案 0 :(得分:1)

对于您的问题,有一个很好的解决方案-利用TypeScript声明文件(*.d.ts)引入通用接口,以扩展标准表单类,例如AbstractControlFormControl等。不会引入任何新功能,并且在已编译的JavaScript中没有占用空间,但同时会执行强类型检查。

它是suggested由Daniele Morosinotto于今年3月提出,there are talks现在已将其包含在Angular 9中。

采用解决方案非常简单:

  1. this gist下载TypedForms.d.ts,并将其另存为src/typings.d.ts在您的项目中(Angular 6+已经知道如何使用此文件)。
  2. 每当需要强类型验证时就开始使用新类型(FormGroupTyped<T>FormControlTyped<T>等)(请参见that giststackblitz中的示例)。

有关更多信息,请查看blog post分析强类型表单的可用解决方案。