Подтвердить что ты не робот

Могу ли я использовать назначение destructuring с immutable.js?

Со стандартными объектами JS можно использовать назначение деструктурирования, например:

let obj = {name: 'james', code: '007'}
let {name, code} = obj // creates new variables 'name' and 'code' (with the proper values)

Как было предложено некоторым евангелистом Flux/Redux, я использую immutable.js для своего приложения; могу ли я использовать деструктурирование также в неизменяемом списке/карте? Конечно, можно было бы сделать:

let obj = immutable.fromJS({name: 'james', code: '007'})
let {name, code} = obj.toJS()

но это кажется весьма неэффективным по мере того, как объекты растут (потому что объект должен быть глубоко jsified в первую очередь).

4b9b3361

Ответ 1

С неизменным списком деструктурирование работает довольно прямо. Это связано с тем, что разрушение массивов работает на каждом итеративном (проверке того, что что-то повторяется) и не подвергается только массиву js.

С картой ситуация сложнее. В отличие от List, деструктуризация Map-подобных структур подчиняется просто простым JS-объектам и не более того. В настоящее время не кажется, что сообщество ES считает это хорошей идеей (см. https://esdiscuss.org/topic/extensible-destructuring-proposal)

Однако существует babel-плагин, который позволяет это: https://github.com/vacuumlabs/babel-plugin-extensible-destructuring Если этот плагин установлен и включен в .babelrc, вы можете просто установить неизменяемую карту для определения метода [email protected]@get:

// main.js, first file loaded
import {Iterable} from 'immutable';
Iterable.prototype[Symbol.for('get')] = function(value) {return this.get(value); };

и все работает (также вложенное деструктурирование или деструктурирование со значениями по умолчанию)

import {fromJS} from 'immutable';
const map = fromJS({author: {name: {first: "John", last: "Doe"}, birthdate: "10-10-2010"}});
const {author: {name: {first, last}, birthdate}} = map;

Отказ от ответственности: я являюсь одним из авторов упомянутого выше плагина.