I've been looking through tutorials and I can't seem to find a good solution anywhere.
In all of the tutorials with forms, they rewrite so much. A simple input with validation and an error message can be several lines long with several tags as well.
Wouldn't it be smarter to create something like app-input, that you pass a name and label and it generates the rest?  
Here's how I made my username field,
<div class="form-group">
    <label for="username">Username</label>
    <label for="username"
           aria-haspopup="true"
           role="tooltip"
           class="tooltip tooltip-validation tooltip-sm"
           [class.invalid]="loginForm.get('username').invalid
        && (loginForm.get('username').dirty || loginForm.get('username').touched)">
        <input id="username" type="text"
               formControlName="username">
        <span class="tooltip-content">Username is required.</span>
    </label>
</div>
Wouldn't something like
<app-input name="username" label="username"></app-input>
be a lot simpler? Or is there a downside to this that I'm not thinking of?
matInput) on the<input>to avoid having to create an@Input()for each and every possible HTML attribute that could be put onto<input>elements. Attribute directives are very powerful.