我可以使用 immutable.js 的解构赋值吗?

Can I use destructuring assignment with 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()

但是随着对象变大,这似乎效率很低(因为首先需要对对象进行深度js化)。

使用不可变列表,解构工作非常简单。这是因为数组的解构适用于每个可迭代对象 (Checking whether something is iterable),而不仅仅受 js 数组的影响。

有了Map,情况就复杂多了。与 List 不同,Map-like 结构的解构仅受普通 JS 对象的影响,仅此而已。目前,ES 社区似乎并不认为这是一个好主意(参见 https://esdiscuss.org/topic/extensible-destructuring-proposal

但是,babel-plugin 可以实现这一点:https://github.com/vacuumlabs/babel-plugin-extensible-destructuring 在 .babelrc 中安装并启用此插件后,您可以简单地修补不可变 Map 以定义 .@@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;

免责声明:我是上述插件的作者之一。