I want now to pass to typed reactive forms ( with Angular 14 )- what is good is that are typed,i.e. I can see errors if some property is not correct.
The code previously was
profileForm = this.fb.group({ url: [''], publicTILTS: this.fb.array([]) });
Now the code looks like
profileForm = new FormGroup({ url: new FormControl(''), publicTILTS: new FormArray([new FormControl(new TILT())]) });
And you may ask – what is the difference ? The difference is type inferring from generics. For example,the constructor for FormControl ( after several steps,since it is a interface)
new <T = any>(value: FormControlState<T> | T //more code
So the above definition is,actually,this one:
profileForm = new FormGroup({ url: new FormControl<string>(''), publicTILTS: new FormArray<FormControl<TILT|null>>([new FormControl<TILT>(new TILT())]) });
Now the other modifications are
- Get rid of formArray
- typed data in HTML :
<div *ngFor="let item of profileForm.value.publicTILTS; let i = index;let f=first">
- modify the string url It was hardcoded:
tap(it => this.profileForm.controls['url'].setValue(it)),
Now it is typed patchValue that has a Partial – typed!
tap(it => this.profileForm.patchValue({url:it}))
Just technical,the relevant definitions are
patchValue(value: ɵFormGroupValue<TControl>,options?: { onlySelf?: boolean; emitEvent?: boolean; }): void; export declare type ɵFormGroupValue<T extends { [K in keyof T]?: AbstractControl<any>; }> = ɵTypedOrUntyped<T,Partial<{ [K in keyof T]: ɵValue<T[K]>; }>,{ [key: string]: any; }>;
- Modified the array – patchValue does not work with arrays,so setControl to the rescue
Now it is
//this do not work - do not modify the array length,but the contents // this.profileForm.patchValue({publicTILTS: [...it]}); //setControl<K extends string & keyof TControl> this.profileForm.setControl("publicTILTS",new FormArray(it.map(a=>new FormControl(a))));
Again it is typed,even if it seems a string- I have put a comment above with the definition – see keyof ? It will raise an error at compile time!
For the end user,the site is THE SAME. However,the code now is typed – and,yes,this is a great deal for programmer!
Leave a Reply