我的Angular总结:建议使用FormGroup.controls 来访问子表单控件

在 Angular 中,我们至少有两种方法可以访问子表单控件:FormGroup.get('controlPath')FormGroup.controls.controlPath。到目前为止,为了类型安全,我选择使用后者。

考虑到下面的代码:

ts 复制代码
@Component({
  selector: 'app-root',
  templateUrl: './app/playground.component.html',
  imports: [FormsModule, ReactiveFormsModule],
})
export class PlaygroundComponent {
  formGroup = this.formBuilder.group({
    booker: new FormControl('123', {validators: [Validators.required]}),
    bookNames: this.formBuilder.array<string>([]),
    bookerConf: this.formBuilder.group({language: ''})
  });
  constructor(private formBuilder: FormBuilder) {
    const bookerFromControl = this.formGroup.controls.booker; // FormControl<string | null>
    const bookerFromGetPath = this.formGroup.get('booker'); // AbstractControl<string | null, string | null> | null
    const bookerFromGetPaths = this.formGroup.get(['booker']); // AbstractControl<any, any> | null
    const bookerFromGetPathsWithConst = this.formGroup.get(['booker'] as const); // AbstractControl<string | null, string | null> | null
    
    const bookNameFromControls = this.formGroup.controls.bookNames; // FormArray<FormControl<string | null>>
    const bookNamesFromPath = this.formGroup.get('bookNames'); // AbstractControl<(string | null)[], (string | null)[]> | null
    const bookNamesFromPaths = this.formGroup.get(['bookNames']); // AbstractControl<any, any> | null
    const bookNamesFromPathsWithConst = this.formGroup.get(['bookNames'] as const); // AbstractControl<(string | null)[], (string | null)[]> | null
  }
}

如你所见,formGroup.get 至少有两个问题

  • 无法识别是否存在 booker 字段,因此 bookerFromGetPath 的类型可能是 null

    • 当键入错误的表单控件名称时,例如 formGroup.get('booker1'),不会有任何错误提示。
    • 同样,当你想要利用 VSCode 的重构功能对 booker 字段名称进行批量修改时,formGroup.get('booker') 并不会被自动改掉。
    • 使用路径数组参数时类型变得更糟,如 formGroup.get(['booker'])。但对于这种情况,我们可以使用as const,例如formGroup.get(['booker'] as const)来改善这种情况。
  • bookerFromGetPath 返回了错误的类型,AbstractControl 而不是 FormControl

    • 这不是一个大问题,因为 AbstractControl 类似于 FormControl
    • 但是对于 bookNameFromControlsFormArrayAbstractControl 之间的差异很大。

有一个开放的问题 严格类型的 FormGroup 应该有严格类型的 "get" 访问器 在2024年11月16日提出。

截至2025年4月20日,这个问题仍未解决,而且该问题只关注了我们发现的第一个问题。

不管怎样,这就是我选择的原因。

相关推荐
穗余9 分钟前
NodeJS全栈开发面试题讲解——P2Express / Nest 后端开发
前端·node.js
航Hang*21 分钟前
WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM
前端·笔记·edge·less·css3·html5·webstorm
江城开朗的豌豆23 分钟前
JavaScript篇:a==0 && a==1 居然能成立?揭秘JS中的"魔法"比较
前端·javascript·面试
江城开朗的豌豆30 分钟前
JavaScript篇:setTimeout遇上for循环:为什么总是输出5?如何正确输出0-4?
前端·javascript·面试
橘子味的冰淇淋~42 分钟前
npm run build 报错:Some chunks are larger than 500 KB after minification
前端·npm·node.js
QING6181 小时前
Gradle 核心配置属性详解 - 新手指南(二)
android·前端·gradle
普通老人1 小时前
【前端】Vue中实现pdf逐页转图片,图片再逐张提取文字
前端·vue.js·pdf
QING6181 小时前
Gradle 核心配置属性详解 - 新手指南(一)
android·前端·gradle
天涯学馆1 小时前
TypeScript 在大型项目中的应用:从理论到实践的全面指南
前端·javascript·面试
robotmen2 小时前
CSS动态虚线边框
前端·css