7

我希望我的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 抛出了一个错误:nameFormGroup.

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

问题是没有办法为任何AbstractFormControl孩子指定这个泛型类型。

我认为这很容易FormGroup用自己的界面覆盖。但是,有没有办法仅使用 Angular 来实现这一点?如果没有,是否有第三方解决方案?

动机:我想轻松地重构我的SomeSource. 目前,当我重构SomeSource界面时,表单没有被适配并且没有抛出错误 => 有一些错误的空间。

4

1 回答 1

4

有一个优雅的解决方案可以解决您的问题 - 利用 TypeScript 声明文件 ( )*.d.ts来引入扩展标准表单类(AbstractControlFormControl执行强类型检查的时间。

它是由 Daniele Morosinotto 在今年 3 月提出的,现在正在讨论将其包含在 Angular 9 中。

采用该解决方案很简单:

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

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

于 2019-06-06T11:17:07.650 回答