TypeScript 3.7 now supports the optional chaining operator . Hence, you can write code such as:
const value = a?.b?.c;
Ie, you can use this operator to access properties of an object, where the object itself may be null
or undefined
. Now what I would like to do is basically the same, but the property names are dynamic:
const value = a?[b]?.c;
However, there I get a syntax error:
error TS1005: ':' expected.
What am I doing wrong here? Is this even possible?
The proposal seems to imply that this is not possible (but maybe I get the syntax examples wrong).
When accessing a property using bracket notation and optional chaining, you need to use a dot in addition to the brackets:
const value = a?.[b]?.c;
This is the syntax that was adopted by the TC39 proposal , because otherwise it's hard for the parser to figure out if this ?
is part of a ternary expression or part of optional chaining.
The way I think about it: the symbol for optional chaining isn't ?
, it's ?.
. If you're doing optional chaining, you'll always be using both characters.
?.
Here are some examples for nullable property and function handling.
const example = {a: ["first", {b:3}, false]}
// Properties
example?.a // ["first", {b:3}, false]
example?.b // undefined
// Dynamic properties ?.[]
example?.a?.[0] // "first"
example?.a?.[1]?.a // undefined
example?.a?.[1]?.b // 3
// Functions ?.()
null?.() // undefined
validFunction?.() // result
(() => {return 1})?.() // 1
??
(Nullish Coalescing) can be used to set a default value if undefined or null.
const notNull = possiblyNull ?? defaultValue
const alsoNotNull = a?.b?.c ?? possiblyNullFallback ?? defaultValue
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.