javascript christmas

Elvis Operator

←Previous postNext post →

How to rock and roll with Optional Chaining

A 2 min read written by
Henrik Hermansen

Elvis Presley Operator

Are you being a responsible developer and rocking your undefined-checks to prevent TypeError like this?

const street = customer && customer.address && customer.address.street

That's nice, but you may have noticed it doesn't roll very well. While it's great to protect yourself from type errors, it can get tedious and cumbersome, and it doesn't feel very DRY.

I hope this won't leave you all shook up. Instead, you should read on - it's now or never!

Rock and roll 🕺

As you learned on Day 1 JavaScript is always open for suggested features and additions. One of these suggestions is called "Optional Chaining", and is about the operator best known as the Elvis operator.

The suggested operator looks like this ?., and you can use it to chain undefined-checks:

const street = customer?.address?.street

This will check if both customer and address is present, and give you the value of street. However, if customer does not have the property address, or if customer.address does not have the property street, your variable will receive the value undefined, and no type errors are thrown.

You can even use this to safely (kinda) run functions or access items in an array:

customers?.[2]
api?.getCustomer?.()

This will make sure both api and api.getCustomer is present, before trying to run getCustomer. Beware though, that this will still throw a type error if getCustomer is not a function.

Could I go wrong with this?

Yes, there are some limitations and gotchas to this feature.

The biggest pitfall might be that each operator will only check the current link in the chain:

customer?.address.street // will throw an error if address is undefined
customer.address?.street // will throw an error if customer is undefined

For more details I suggest you have a closer look at The Proposal the proposal.

Awesome! When can I use it?

Now! While the feature is currently in stage 1, it is of course available as a babel plugin.

I don't know about you, but I just can't help falling in love.

←Previous postNext post →