我希望我的FormControl
(FormGroup
/ 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;有一些错误的空间。
答案 0 :(得分:1)
对于您的问题,有一个很好的解决方案-利用TypeScript声明文件(*.d.ts
)引入通用接口,以扩展标准表单类,例如AbstractControl
,FormControl
等。不会引入任何新功能,并且在已编译的JavaScript中没有占用空间,但同时会执行强类型检查。
它是suggested由Daniele Morosinotto于今年3月提出,there are talks现在已将其包含在Angular 9中。
采用解决方案非常简单:
TypedForms.d.ts
,并将其另存为src/typings.d.ts
在您的项目中(Angular 6+已经知道如何使用此文件)。FormGroupTyped<T>
,FormControlTyped<T>
等)(请参见that gist或stackblitz中的示例)。有关更多信息,请查看blog post分析强类型表单的可用解决方案。