javascriptreactjstypescriptoptional-chaining

JS optional chaining clarification


I found a really great use case for optional chaining in my react project. I have used it slightly before but this line of code has made me a bit confused.

I have a table that is sortable. One of the columns shows success or failure depending on if failed_date is null or a date.

sortedRows = sortedRows.sort((a, b) => a?.failed_date?.localeCompare(b?.failed_date));

But What confuses me is which value does the '?.' check is nullish?

Does a.failed_date?.localeCompare() check if failed_date?. is null/undefined or does it check if ?.localeCompare() is null/undefined?

Same with b?.failed_date is it checking b to be nullish? or failed_date.

I think My confusion comes from looking at the Documentation

Because arr?.[50] checks if element 50 is nullish but obj.method?.() checks if the method is not nullish?

Looking at this second block of code (which I believe is now correct) a.failed_date may be nullish and won't do localeCompare if a.failed_date is null? But what if a.failed_date is not null but b.failed_date is null? Does localeCompare not care? I haven't gotten an error but I was using localeComapre(b?.failed_date)

sortedRows = sortedRows.sort((a, b) => a.failed_date?.localeCompare(b.failed_date));

Solution

  • Let's say you define variable like below

    const variable = { value: 'test' };
    

    then you want to access variable?.value it equals variable === null || variable === undefined ? undefined : variable.value.

    Same with array.

    Check typescript playground and see js output https://www.typescriptlang.org/play?#code/MYewdgzgLgBAhgJwXAnjAvDA2gXQNwBQBiyKA-AHRYCsADDkA