Parámetro de función de desestructuración de ES6: denominación del objeto raíz

Resuelto jbx asked hace 9 años • 5 respuestas

¿Hay alguna manera de conservar el nombre de un argumento de función desestructurada? Es decir, ¿el nombre del objeto raíz?

En ES5, podría hacer esto (usando la herencia como metáfora para aclarar el punto):

// ES5:
var setupParentClass5 = function(options) {
    textEditor.setup(options.rows, options.columns);
};

var setupChildClass5 = function(options) {
    rangeSlider.setup(options.minVal, options.maxVal);
    setupParentClass5(options); // <= we pass the options object UP
};

Estoy usando el mismo optionsobjeto para contener múltiples parámetros de configuración. Algunos parámetros los utiliza la clase principal y otros los utiliza la subclase.

¿Hay alguna manera de hacer esto con argumentos de funciones desestructuradas en ES6?

// ES6:
var setupParentClass6 = ({rows, columns}) => {
    textEditor.setup(rows, columns);
};

var setupChildClass6 = ({minVal, maxVal}) => {
    rangeSlider.setup(minVal, maxVal);
    setupParentClass6( /* ??? */ );  // how to pass the root options object?
};

¿O necesito extraer todas las opciones setupChildClass6()para poder pasarlas individualmente setupParentClass6()?

// ugh.
var setupChildClass6b = ({minVal, maxVal, rows, columns}) => {
    rangeSlider.setup(minVal, maxVal);
    setupParentClass6({rows, columns});
};
jbx avatar Mar 14 '15 23:03 jbx
Aceptado

Yo mismo tengo los argumentos de "opciones" en demasiados lugares. Optaría por 1 línea adicional de código. No vale la pena en este ejemplo, pero es una buena solución cuando se tiene desestructuración en más líneas.

const setupChildClass6 = options => {
    const {minVal, maxVal} = options;
    rangeSlider.setup(minVal, maxVal);
    setupParentClass6(options); 
};
Niels Steenbeek avatar Dec 07 '2015 21:12 Niels Steenbeek

No puedes hacerlo directamente en los argumentos, pero puedes extraer los valores después:

function myFun(allVals) {
    const { val1, val2, val3 } = allVals;
    console.log("easy access to individual entries:", val2);
    console.log("easy access to all entries:", allVals);
}
Quentin Roy avatar Oct 17 '2015 10:10 Quentin Roy

No se puede utilizar un argumento posicional con nombre simple y desestructurante para el mismo parámetro al mismo tiempo. Lo que puedes hacer:

  1. Utilice la desestructuración para setupParentClass6la función, pero el antiguo enfoque de ES6 setupChildClass6(creo que esta es la mejor opción, simplemente acorte el nombre):

    var setupChildClass6 = (o) => {
      rangeSlider.setup(o.minVal, o.maxVal);
      setupParentClass6(o); 
    };
    
  2. Utilice argumentsun objeto antiguo. Pero argumentspuede ralentizar una función (en particular V8), por lo que creo que es un mal enfoque:

    var setupChildClass6 = ({minVal, maxVal}) => {
      rangeSlider.setup(minVal, maxVal);
      setupParentClass6(arguments[0]); 
    };
    
  3. ES7 tiene una propuesta para propiedades de descanso/extensión (si no las necesita minValy maxValestá en setupParentCalss6función):

    var setupChildClass6b = ({minVal, maxVal, ...rest}) => {
      rangeSlider.setup(minVal, maxVal);
      setupParentClass6(rest);
    };
    

    Lamentablemente no es ES6.

alexpods avatar Mar 14 '2015 16:03 alexpods