import {ControlValueAccessor, FormControl, ValidationErrors, Validator} from '@angular/forms'; export abstract class CustomInputComponent implements ControlValueAccessor, Validator { protected value: any; protected parseError: boolean; private propagateChange: (_: any) => void = () => {}; private propagateTouch: () => void = () => {}; // set initial value public abstract writeValue(obj: any): void; // register function to notify on change public registerOnChange(fn: (_: any) => void): void { this.propagateChange = fn; } // register function to notify on touch public registerOnTouched(fn: () => void): void { this.propagateTouch = fn; } // validates the form, returns null when valid else the validation object public abstract validate(c: FormControl): ValidationErrors; // on change protected change(): void { this.propagateChange(this.value); } // on touch protected blur(): void { this.propagateTouch(); } }