it's my first question on StackOverflow after years of using it, I'll try to do by best.
I have to develop a dynamic form with dynamic validations, for example in France (where I work), we have different adresses styles : a standard way with a road type / road name and an alternative format.
this.adress = this.fb.group({
  roadType: ['', Validators.required],
  roadName: ['', [ Validators.required,
                   Validators.minLength(5),
                   Validators.maxLength(20)] ],
  altRoad: ['', [ Validators.required,
                  Validators.maxLength(20)] ]
});
As you can see, at init, the 3 inputs are required. The rule I have to implement is to have at least 1 adress entered, so I put some watchers on valueChanges and when we type in an Input, the other adress format input has to lose its "required" validation.
this.altRoadSubscription = this.adress.get('altRoad').valueChanges.subscribe(val => {
        if (val && val !== ''){
            this.form.controls['roadType'].clearValidators();
            this.form.controls['roadType'].updateValueAndValidity();
            this.form.controls['roadName'].clearValidators();
            this.form.controls['roadName'].updateValueAndValidity();
        } else {
            this.form.controls['roadType'].setValidators(Validators.required);
            this.form.controls['roadName'].setValidators(Validators.required);
        }
    }
});
this.roadTypeSubscription = this.adress.get('roadType').valueChanges.subscribe(val => {
        const roadName = this.adress.controls['roadName'].value;
        if ((!val || val === '') && (!roadName || roadName === '')){
            this.adress.controls['altRoad'].setValidators(Validators.required);
        } else {
            this.adress.controls['altRoad'].clearValidators();
            this.adress.controls['altRoad'].updateValueAndValidity();
        }
});
this.roadNameSubscription = this.form.get('nomVoie').valueChanges.subscribe(val => {
  if ((!val || val === '') && (!roadType || roadType === '')){
      this.form.controls['altRoad'].setValidators(Validators.required);
  } else {
      this.form.controls['altRoad'].clearValidators();
      this.form.controls['altRoad'].updateValueAndValidity();
  }
})
The real big deal to play with are the other validators! I don't want to lose my minLength and maxLength validation when I switch between one adress to another and have to build a generic / standard method not to store the validators outside the formControl. (Everything will be managed from parents components)
How can I remove / add a single validator to the validators list without flushing every other validators by using a simple setValidators() method?
AND / OR
Is there a hack to get the current Validators list ? (to store them temporary and  use setValidators() only with the validators we want to keep)
I saw this question that bring out an anwser but it seems like it doesn't work because of the type of the "control" used as a string instead of the AbstractControl.validator() prototype that expects an AbstractControl)