¿Puedo usar la asignación de desestructuración con immutable.js?
destructuring (1)
Con los objetos JS estándar, se puede usar una asignación de desestructuración como:
let obj = {name: ''james'', code: ''007''}
let {name, code} = obj // creates new variables ''name'' and ''code'' (with the proper values)
Según lo sugerido por algún evangelista de Flux / Redux, uso immutable.js para mi aplicación; ¿Puedo usar la desestructuración también en Lista / Mapa inmutable? Por supuesto, uno podría hacer:
let obj = immutable.fromJS({name: ''james'', code: ''007''})
let {name, code} = obj.toJS()
pero parece que esto es bastante ineficiente a medida que los objetos crecen (porque el objeto debe estar profundamente detallado primero).
Con la Lista inmutable, la desestructuración funciona de manera bastante directa. Esto se debe a que la desestructuración de Arrays funciona en todas las iterables ( verificando si algo es iterable ) y no está sujeta solo a js Arrays.
Con Map, la situación es más complicada. A diferencia de la Lista, la desestructuración de estructuras tipo Map está sujeta solo a objetos JS simples y nada más. Actualmente, no parece que la comunidad de ES considere esto como una buena idea (consulte https://esdiscuss.org/topic/extensible-destructuring-proposal )
Sin embargo, existe un plugin de babel que lo habilita: https://github.com/vacuumlabs/babel-plugin-extensible-destructuring Al tener este plugin instalado y habilitado en .babelrc, simplemente puede parchear un Mapa inmutable para tener un .@@get
método definido:
// main.js, first file loaded
import {Iterable} from ''immutable'';
Iterable.prototype[Symbol.for(''get'')] = function(value) {return this.get(value); };
y todo funciona (también desestructuración anidada o desestructuración con valores predeterminados)
import {fromJS} from ''immutable'';
const map = fromJS({author: {name: {first: "John", last: "Doe"}, birthdate: "10-10-2010"}});
const {author: {name: {first, last}, birthdate}} = map;
Descargo de responsabilidad: Soy uno de los autores del complemento mencionado anteriormente.