2016-01-13 12 views
14

Con oggetti standard JS, si può usare la destrutturazione incarico come ad esempio:Posso usare il compito di destrutturazione con immutable.js?

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

come suggerito da alcuni Flux/Redux evangelista, io uso immutable.js per la mia app; posso usare la destrutturazione anche su Lista/Mappa immutabile? Naturalmente, si potrebbe fare:

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

ma questo sembra avere abbastanza inefficiente come gli oggetti diventano più grandi (perché l'oggetto deve essere profondamente jsified prima).

risposta

28

Con la lista immutabile, la destrutturazione funziona in modo abbastanza semplice. Questo perché la destrutturazione degli array funziona su ogni iterabile (Checking whether something is iterable) e non è soggetta solo agli array js.

Con Map, la situazione è più complicata. A differenza di List, la destrutturazione di strutture simili a mappe è soggetta solo a semplici oggetti JS e nulla più. Attualmente, non sembra che la comunità ES considera questa una buona idea (vedi https://esdiscuss.org/topic/extensible-destructuring-proposal)

Tuttavia, esistono babel-plugin che permette questo: https://github.com/vacuumlabs/babel-plugin-extensible-destructuring Avere installato e abilitato in .babelrc questo plugin, si può semplicemente rattoppare immutabili Mappa di avere un metodo [email protected]@get definito:

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

e tutto funziona (destrutturazione anche annidati, o destrutturazione con valori di default)

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

Disclaimer: sono uno degli autori del plugin menzionato sopra.

Problemi correlati