在 TC39 将 Optional Chaining 转移到 Stage 3 之后,TypeScript 在 3.7 版本中也带来了对应的 Optional Chaining 功能。总体上,TypeScript 的 Optional Chaining 功能和 JavaScript 的提案是保持一致的。总结来说,就是:
如果属性值是
undefined
或者null
,就会直接返回undefined
,否则会进一步获取真实的属性值。
在 TypeScript Playground 中可以尝试一下这个新的功能。以下面这段 TypeScript 为例:
let x = foo?.bar?.();
最终会被转译成下面的这段 JavaScript:
"use strict";
var _a, _b, _c;
let x = (_c = (_a = foo) === null || _a === void 0 ?
void 0 :
(_b = _a).bar) === null || _c === void 0 ?
void 0 :
_c.call(_b);
几点简单的说明:
- 即使值是
null
,最终返回的结果也会是undefined
(上面代码中是void 0
,是等价的); - 只有
null
和undefined
的情况会被直接返回。这一点,和之前foo && foo.bar
这样的写法是有区别的。主要是 JavaScript 对哪些值是 falsy 的判断,范围会比null
&undefined
更广,还包括了NaN
,0
,false
等; - Optional Chaining 在函数调用中也是可以用的,写法是
xx?.()
,如果不存在,函数不会调用,而是直接返回undefined
; - Optional Chaining 也可以使用如下的写法:
foo?.[0]
,foo?.['var-name']
或foo?.[variableName]
官方的发布介绍文档见这里。