Handling Arrays and Objects with FormGroup and FormControl

import {FormArray, FormControl, FormGroup} from '@angular/forms';

export type FormGroupOf<T> = {
  [key in keyof T]: T[key] extends Array<infer TArray>
    ? TArray extends string | number | boolean
      ? FormControl<T[key] | null | undefined>
      : FormArray<FormGroup<FormGroupOf<TArray>>>
    : T[key] extends object
      ? FormGroup<FormGroupOf<T[key]>>
      : FormControl<T[key] | null | undefined>;
};

export interface IDto {
  numbers: number[];
  other: string;
}

let form = new FormGroup<FormGroupOf<IDto>>({
  numbers: new FormControl([]),
  other: new FormControl(''),
});