Jasmine单元测试中FormBuilder#group废弃告警如何解决?
deprecation group is deprecated: This API is not typesafe and can result in issues with Closure Compiler renaming. Use the
FormBuilder#groupoverload withAbstractControlOptionsinstead.
这个告警的触发原因是你调用了FormBuilder中已被标记为弃用的group方法重载:旧版本允许第二个参数直接传入校验函数/校验函数数组,新版本要求第二个参数必须是符合AbstractControlOptions类型的对象(包含validators、asyncValidators、updateOn等可选属性)。
你的测试代码中虽然是用Jasmine Spy模拟的FormBuilder实例,但只要调用group方法的签名匹配了已弃用的旧重载,lint就会触发告警,和生产代码的触发逻辑一致。
可行处理方案
方案1:调整所有测试中
formBuilder.group的调用参数,匹配新重载
如果你调用group时不需要额外配置,只需在第二个参数位置显式传入空对象即可,示例:// 旧写法,触发告警 formBuilder.group({ username: [''], password: [''] }) // 新写法,消除告警 formBuilder.group({ username: [''], password: [''] }, {}) // 第二个参数为符合AbstractControlOptions类型的空对象如果需要传入校验规则,改为包裹在对象内的写法:
// 旧写法 formBuilder.group({ name: [''] }, Validators.required) // 新写法 formBuilder.group({ name: [''] }, { validators: Validators.required })方案2:显式声明Spy的
group方法匹配新重载签名
定义Spy时明确标注group方法的入参类型,让lint识别到你使用的是未弃用的重载,示例:import { AbstractControlOptions, FormBuilder } from '@angular/forms'; import { EMPTY } from 'rxjs'; // 定义Spy时明确group方法的参数匹配新重载 formBuilder = jasmine.createSpyObj<FormBuilder>('formBuilder', { group: (controls: Record<string, any>, options?: AbstractControlOptions) => ({ valueChanges: EMPTY, value: {} } as any) });方案3:临时禁用测试文件的对应lint规则(不推荐)
如果修改所有调用成本过高,可在测试文件顶部加注释忽略该规则,ESLint规则示例:/* eslint-disable @angular-eslint/no-deprecated-form-group */
内容的提问来源于stack exchange,提问作者lefanous

