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

时间:2016-01-13 09:16:24

标签: immutable.js destructuring

使用标准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作为我的应用程序;我可以在不可变的List / Map上使用解构吗?当然,人们可以这样做:

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

但随着对象变大,这似乎效率很低(因为对象需要先被深深地理解)。

1 个答案:

答案 0 :(得分:36)

使用不可变List,解构非常简单。这是因为Arrays的解构适用于每个可迭代的(Checking whether something is iterable)并且不仅仅受到js Arrays的影响。

使用Map,情况更复杂。与List不同,类似Map的结构的解构只受简单的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;

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