I actually think Angular's own examples on how @Input and @Output work are pretty poor.
Here is a simple StackBlitz example, which shows how it's done:
https://angular-ivy-yqycev.stackblitz.io
It looks like this:

When you type in characters in the "transmitter" textbox, it'll send your string as an @Output... and the "receiver" will receive it via as an @Input, and show it in it's own textbox.
The key thing is that the "Transmitter" component will use an @Output...
transmitter.component.html:
<div>
<h3>Transmitter</h3>
<input type="text" [(ngModel)]="value" (ngModelChange)="onChange($event)" />
</div>
transmitter.component.ts:
@Output() emitter = new EventEmitter<string>();
onChange(event:any) {
this.emitter.emit(this.value);
}
And the "Receiver" component will use an @Input()...
receiver.component.html:
<div>
<h3>Receiver</h3>
<input type="text" [(ngModel)]="inputValue" />
</div>
receiver.component.ts:
@Input() inputValue = "";
And, you can tie them together using this:
app.component.html:
<app-transmitter (emitter)="onEmitter($event)"></app-transmitter>
<app-receiver [inputValue]="currentValue"></app-receiver>
app.component.ts:
export class AppComponent {
currentValue = '';
onEmitter(event:any) {
console.log('Received: ' + event);
this.currentValue = event;
}
}
Hope this helps !