JSPM

  • Created
  • Published
  • Downloads 12227678
  • Score
    100M100P100Q41444F
  • License MIT

Transform optional chaining operators into a series of nil checks

Package Exports

  • @babel/plugin-proposal-optional-chaining

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@babel/plugin-proposal-optional-chaining) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

@babel/plugin-proposal-optional-chaining

The Optional Chaining Operator allows you to handle properties of deeply nested objects without worrying about undefined intermediate objects.

Example

Accessing deeply nested properties

const obj = {
  foo: {
    bar: {
      baz: 42,
    },
  },
};

const baz = obj?.foo?.bar?.baz; // 42

const safe = obj?.qux?.baz; // undefined

// Optional chaining and normal chaining can be intermixed
obj?.foo.bar?.baz; // Only access `foo` if `obj` exists, and `baz` if
                   // `bar` exists

Calling deeply nested functions

const obj = {
  foo: {
    bar: {
      baz() {
        return 42;
      },
    },
  },
};

const baz = obj?.foo?.bar?.baz(); // 42

const safe = obj?.qux?.baz(); // undefined
const safe2 = obj?.foo.bar.qux?.(); // undefined

const willThrow = obj?.foo.bar.qux(); // Error: not a function

// Top function can be called directly, too.
function test() {
  return 42;
}
test?.(); // 42

exists?.(); // undefined

Constructing deeply nested classes

const obj = {
  foo: {
    bar: {
      baz: class {
      },
    },
  },
};

const baz = new obj?.foo?.bar?.baz(); // baz instance

const safe = new obj?.qux?.baz(); // undefined
const safe2 = new obj?.foo.bar.qux?.(); // undefined

const willThrow = new obj?.foo.bar.qux(); // Error: not a constructor

// Top classes can be called directly, too.
class Test {
}
new Test?.(); // test instance

new exists?.(); // undefined

Installation

npm install --save-dev @babel/plugin-proposal-optional-chaining

Usage

.babelrc

{
  "plugins": ["@babel/plugin-proposal-optional-chaining"]
}

Via CLI

babel --plugins @babel/plugin-proposal-optional-chaining script.js

Via Node API

require("@babel/core").transform("code", {
  plugins: ["@babel/plugin-proposal-optional-chaining"]
});

Options

loose

boolean, defaults to false.

When true, this transform will pretend document.all does not exist, and perform loose equality checks with null instead of string equality checks against both null and undefined.

Example

In

foo?.bar;

Out (loose === true)

foo == null ? void 0 : foo.bar;

Out (loose === false)

foo === null || foo === void 0 ? void 0 : foo.bar;

References