少なくとも私の経験では、ここでの2つの回答は洞察力に富んでいますが、単独では機能していません。
私は両方の部分をまとめて、このバージョンを思いつきました。これは現在、リアクティブな形式で Angular 4.1.1 で動作しています。
import { Directive, Renderer, ElementRef, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, DefaultValueAccessor } from '@angular/forms';
const LOWERCASE_INPUT_CONTROL_VALUE_ACCESSOR = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => LowerCaseInputDirective),
  multi: true,
};
@Directive({
  selector: 'input[lowercase]',
  host: {
    // When the user updates the input
    '(input)': 'onInput($event.target.value)',
    '(blur)': 'onTouched()',
  },
  providers: [
    LOWERCASE_INPUT_CONTROL_VALUE_ACCESSOR,
  ],
})
export class LowerCaseInputDirective extends DefaultValueAccessor {
  constructor(renderer: Renderer, elementRef: ElementRef) {
    super(renderer, elementRef, false);
  }
  writeValue(value: any): void {
    const transformed = this.transformValue(value);
    super.writeValue(transformed);
  }
  onInput(value: any): void {
    const transformed = this.transformValue(value);
    super.writeValue(transformed);
    this.onChange(transformed);
  }
  private transformValue(value: any): any {
    const result = value && typeof value === 'string'
      ? value.toLowerCase()
      : value;
    return result;
  }
}
これは小文字用ですが、すべてが大文字にも当てはまります。ディレクティブの名前を変更し、 と 内で置き換えselectorますtransformValue。
編集:
そのようなディレクティブを使用した HTML コードからの簡単な使用例:
<input id="myField"
       formControlName="myField"
       type="text" class="form-control required" 
       lowercase>