
In Angular 16+ and 19, the new functional input API using input.required is a powerful way to declare inputs in standalone and signal-based components. But many developers encounter this error:
Property 'signal' does not exist on type 'InputSignal'So what’s the difference between:
characters = input.required<Character[]>();and
characters = input.required<Character[]>().signal;Let’s break it down.
✅ input.required()
This is the official API introduced in Angular 16 and fully stabilized in Angular 19.
What it does:
- Declares a required input.
- Returns an
InputSignal. -
Can be used like a
Signal, but is a distinct type.
Example:
characters = input.required<Character[]>();
ngOnInit() {
console.log(this.characters()); // works like a signal
}✔️ This works in Angular 16, 17, 18, and 19.
❌ input.required().signal (Invalid)
In some blog posts or GitHub examples, you might see .signal added:
characters = input.required<Character[]>().signal;This throws:
Error: Property 'signal' does not exist on type 'InputSignal'Why?
The .signal accessor was considered for future versions of Angular but:
- ❌ It is not implemented as of Angular 19.
- ❌
InputSignalis already reactive — no need to convert it.
✅ How to Use InputSignal Properly
characters = input.required<Character[]>();
const characterCount = computed(() => this.characters().length);Or inside the template:
*ngFor="let c of characters()">{ '{' } c.name { '}' }Angular tracks changes reactively — no .signal needed!
Summary
| Syntax | Description | Works in Angular 16–19? |
|---|---|---|
input.required |
Returns a reactive InputSignal
|
✅ Yes |
input.required |
❌ Invalid: .signal not implemented |
❌ No |
Final Thoughts
Angular’s input.required is already reactive. Treat it like a signal:
- Call
.()to get its current value. - Use it in computed signals or templates.
- No need for
.signal.
If you see
.signal, you're likely reading about an experimental or unofficial version. Stick toinput.required— it’s stable, supported, and reactive by design.()
Happy coding with Signals and Functional Inputs! ⚡