Optional chaining in Typescript was introduced in Typescript 3.7. Let's see how it can help to improve our code.
Properties access
Let's say we have this Car
type
type Car = {
year: number;
color: string;
owner?: {
name: string;
address: string;
}
}
const car: Car = {
year: 2017,
color: 'red',
}
If we want to access properties inside owner
field, we used to write it as
const carOwnerName = car.owner && car.owner.name;
But using optional chaining, we could rewrite it as
const carOwnerName = car.owner?.name;
Definitely way simpler than previous code. The code basically will be executed when owner
exists. If owner
is null
or undefined
, it will stop and will give us undefined
.
We probably will also add extra ?
for car as well, so it becomes
const carOwnerName = car?.owner?.name;
Array item access
For this case, let's add one more optional property features
which is an array into our Car
type
type Car = {
year: number;
color: string;
owner?: {
name: string;
address: string;
},
features?: string[]
}
If we want to access any element inside features
, we could also do this
const firstFeature = car.features?.[0];
Also if we have out-of-box property name such as
type Car = {
// ...
owner?: {
// ...
'previous-address': string;
}
}
We also could use []
from optional chaining such as
const firstFeature = car.owner?.['previous-address'];
Optional function call
It's quite useful to execute function where it can be optional
function callApi(callback?: () => void) {
callback?.();
}
Other use case is for optional function call as seen below
type Car = {
// ...
owner?: {
// ...
sendEmail?: () => void; // for sending email to owner
}
}
which can be represented as
car.owner?.sendEmail?.()