Required @Input() properties
👀 Heads-up!
If you're using Angular v16.0.0-next.4 or later, you can ignore this post.
The Angular Compiler now supports required @Input()
properties, so we do not need to resort to workarounds mentioned in this post.
To create a required @Input()
property, simply use the new required
property while defining a required property:
@Input({ required: true }) woopARequiredInput: string;
This week I got asked how to make a component’s input property required. Without giving it much thought I started my answer ‘well, you can just …’, then I stopped asking myself the same question. So I opened a new StackBlitz project and started exploring the options before giving an answer.
Before we start let’s imagine we’re creating a component HelloComponent
to greet a person. In order to greet the person properly, the person
property is required.
Adding a null check link
The first thing that came to my mind was to throw an error when the person
property would be null
or undefined
.
This doesn’t change much except that it would throw a useful error message.
Before: ERROR TypeError: Cannot read property ‘name’ of null
After: ERROR TypeError: The input ‘Person’ is required
Using the selector link
To make the requirement explicit we can use the selector
in the @Component
decorator to require that the attribute on our component has to exist.
Resulting in the following error when we start the application or at compile time when the application is build Ahead of Time (AoT), if the HelloComponent
doesn’t have a person
attribute.
Outcome link
By putting the two together, I can say that I’m happy with the result.
If you got a better way or see a problem with this approach please feel free to let me know, feedback is as always welcome.
The question I’m asking myself right now, is if this is something that should be done in the first place… again let us know your opinion on this 😃.
Below you can find the two put together as well as the StackBlitz project ready for you to play with.
NOTE: I’m using _ngOnInit_
but like Isaac Mann mentioned you could also use _ngOnChanges_
.
Feel free to update this blog post on GitHub, thanks in advance!
Join My Newsletter (WIP)
Join my weekly newsletter to receive my latest blog posts and bits, directly in your inbox.
Support me
I appreciate it if you would support me if have you enjoyed this post and found it useful, thank you in advance.