@oasisdigital/angular-typed-forms-helpers
Version:
Some helper types for when you are dealing with Angular's typed reactive forms system
30 lines (29 loc) • 2.42 kB
TypeScript
import { FormArray, FormControl, FormGroup, AbstractControl } from '@angular/forms';
export type AngularForm<T> = T extends (infer ElementType)[] ? FormArray<AngularForm<ElementType>> : T extends Date ? FormControl<T | null> : T extends object ? FormGroup<{
[Key in keyof T]: AngularForm<T[Key]>;
}> : T extends boolean ? FormControl<boolean | null> : FormControl<T | null>;
export type NonNullableAngularForm<T> = T extends (infer ElementType)[] ? FormArray<NonNullableAngularForm<ElementType>> : T extends Date ? FormControl<T> : T extends object ? FormGroup<{
[Key in keyof T]: NonNullableAngularForm<T[Key]>;
}> : T extends boolean ? FormControl<boolean> : FormControl<T>;
export type AngularFormGroupShallow<T extends object> = T extends any[] | Date ? never : FormGroup<{
[Key in keyof T]: FormControl<T[Key] | null>;
}>;
export type NonNullableAngularFormGroupShallow<T extends object> = T extends any[] | Date ? never : FormGroup<{
[Key in keyof T]: FormControl<T[Key]>;
}>;
export type AngularFormGroup<T extends object> = T extends any[] | Date ? never : FormGroup<{
[Key in keyof T]: AngularForm<T[Key]>;
}>;
export type NonNullableAngularFormGroup<T extends object> = T extends any[] | Date ? never : FormGroup<{
[Key in keyof T]: NonNullableAngularForm<T[Key]>;
}>;
export type AngularFormArrayShallow<T extends any[]> = T extends (infer ElementType)[] ? FormArray<FormControl<ElementType | null>> : never;
export type NonNullableAngularFormArrayShallow<T extends any[]> = T extends (infer ElementType)[] ? FormArray<FormControl<ElementType>> : never;
export type AngularFormArray<T extends any[]> = T extends (infer ElementType)[] ? FormArray<AngularForm<ElementType>> : never;
export type NonNullableAngularFormArray<T extends any[]> = T extends (infer ElementType)[] ? FormArray<NonNullableAngularForm<ElementType>> : never;
export type AngularFormValue<T> = T extends FormArray<infer FA> ? AngularFormValue<FA>[] : T extends FormGroup<infer FG> ? Partial<{
[Key in keyof FG]: AngularFormValue<FG[Key]>;
}> : T extends FormControl<infer FC> ? FC : T extends AbstractControl<infer AC> ? AC : never;
export type AngularFormRawValue<T> = T extends FormArray<infer FA> ? AngularFormRawValue<FA>[] : T extends FormGroup<infer FG> ? {
[Key in keyof FG]: AngularFormRawValue<FG[Key]>;
} : T extends FormControl<infer FC> ? FC : T extends AbstractControl<infer AC> ? AC : never;