angular FormGroup.reset() 输入类型不正确

gywdnpxw  于 6个月前  发布在  Angular
关注(0)|答案(3)|浏览(65)

哪个@angular/*包是bug的来源?

不知道/其他

这是一个回归吗?

描述

这里给出的重置FormGroup的示例与FormGroup.reset()的输入不匹配。根据输入,{value: 'name', disabled: true}是无效的。
FormGroup.reset()的输入应该接受{value: T, disabled: boolean}作为FormControl,因为这是功能的工作方式。

请提供一个最小复现bug的链接

https://replit.com/@david-snyder-in/Typing-Issues#src/app/app.component.ts

请提供您看到的异常或错误

Type '{ value: string; disabled: true; }' is not assignable to type 'string'.

请提供您发现此bug的环境(运行ng version)

Angular CLI: 17.3.2
Node: 20.9.0
Package Manager: npm 10.1.0
OS: win32 x64

Angular: 17.3.2
... animations, cdk, cli, common, compiler, compiler-cli, core
... forms, language-service, material, platform-browser
... platform-browser-dynamic, router

Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1703.2
@angular-devkit/build-angular   17.3.2
@angular-devkit/core            17.3.2
@angular-devkit/schematics      17.3.2
@angular/fire                   17.0.1
@schematics/angular             17.3.2
rxjs                            7.8.1
typescript                      5.4.3
zone.js                         0.14.4

还有其他信息吗?

  • 无响应*
j9per5c4

j9per5c41#

JeanMeche,我可以开始处理这个问题吗?

4jb9z9bj

4jb9z9bj2#

这看起来像是一个Typescript类型错误。在Typescript中,为变量分配类型是有帮助的。例如,语法如下:
let name:string = ver.go
我们说一个名为name的变量是一个字符串,并为其分配了一个值。
错误信息表示first应该是一个字符串,但你试图将其类型设置为'{value:string, disabled:true}'。
请注意{value: 'name', disabled: true}的格式与错误信息{value:string, disabled:true}相匹配。我很难理解错误信息,但我会尝试以下操作:
form.reset({ form.first: {value: 'name', disabled: true}, form.last: 'last' });

eivgtgni

eivgtgni3#

看起来文档在这里给出了错误的指导。因为根据您的示例,form.reset 的类型是:

override reset(
    value: ɵTypedOrUntyped<
      TControl,
      ɵFormGroupValue<TControl>,
      any
    > = {} as unknown as ɵFormGroupValue<TControl>,
    options: {onlySelf?: boolean; emitEvent?: boolean} = {},
  ): void {
    this._forEachChild((control: AbstractControl, name) => {
      control.reset(value ? (value as any)[name] : null, {
        onlySelf: true,
        emitEvent: options.emitEvent,
      });
    });
    // ...
  }

如您所见,它遍历提供的对象并为每个控件调用 reset 方法。AbstractControl 的重置类型是

abstract reset(value?: TValue, options?: Object): void;

这意味着传递的 disabled: true 值似乎被读取为 FormControl 值的一部分,而不是 FormControl 修饰符。
最佳选项是:

form.reset({
  first: 'name',
  last: 'last'
});

form.get('first').disable();

相关问题