Optional Chaining in TypeScript

TypeScript

在 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);

几点简单的说明:

  1. 即使值是 null,最终返回的结果也会是 undefined(上面代码中是 void 0,是等价的);
  2. 只有 nullundefined 的情况会被直接返回。这一点,和之前 foo && foo.bar 这样的写法是有区别的。主要是 JavaScript 对哪些值是 falsy 的判断,范围会比 null & undefined 更广,还包括了 NaN0false 等;
  3. Optional Chaining 在函数调用中也是可以用的,写法是 xx?.(),如果不存在,函数不会调用,而是直接返回 undefined
  4. Optional Chaining 也可以使用如下的写法:foo?.[0]foo?.['var-name']foo?.[variableName]

官方的发布介绍文档见这里