¿Cómo manejar los parámetros predeterminados anidados con la desestructuración de objetos?
Estoy tratando de averiguar si es posible manejar múltiples niveles de parámetros predeterminados con la desestructuración. Como no es fácil de explicar con palabras, aquí hay un ejemplo paso a paso ...
1 - Desestructuración de objetos planos con parámetros predeterminadosDestruir este objeto es fácil:
let obj = {
foo: 'Foo',
bar: 'Bar'
};
Con{foo = 'Foo', bar = 'Bar'} = {}
en una firma de función, se creará un objeto si no se pasa ningún argumento cuando se llama a la función. Si se pasa un objeto pero algunas propiedades referenciadas sonundefined
, serán reemplazados por sus valores predeterminados. Este código funciona bien:
function fn1({foo = 'Foo', bar = 'Bar'} = {}) {
console.log(foo, bar);
}
// OK
fn1(); // Foo Bar
fn1({foo: 'Quux'}); // Quux Bar
fn1({bar: 'Quux'}); // Foo Quux
fn1({foo: 'Quux', bar: 'Quux'}); // Quux Quux
2 - Desestructuración de objetos anidados con parámetros predeterminados superficialesDestruir este objeto es más difícil:
let obj = {
foo: 'Foo',
bar: {
quux: 'Quux',
corge: 'Corge'
}
};
{foo = 'Foo', bar = 'Bar'} = {}
ya no es una opción viable, pero ahora podemos usar{foo = 'Foo', bar = {quux: 'Quux', corge: 'Corge'}} = {}
en una firma de función. Nuevamente, si no se da ningún argumento cuando se llama a la función, se crea un objeto y las propiedades centrales (foo
ybar
) se extraen. Si se pasa un objeto, solo las propiedades indefinidas (foo
obar
) se desestructurarán con sus valores predeterminados.
El problema es que las propiedades del objeto debar
(quux
ycorge
) no forman parte de la "desestructuración de nivel superior". Esto significaquux
ocorge
estaránundefined
si no se establecen explícitamente cuandobar
se pasa como argumento:
function fn2({foo = 'Foo', bar = {quux: 'Quux', corge: 'Corge'}} = {}) {
console.log(foo, bar.quux, bar.corge);
}
// OK
fn2(); // Foo Quux Corge
fn2({foo: 'Quux'}); // Quux Quux Corge
// Oops!
fn2({bar: {quux: 'Baz'}}); // Foo Baz undefined
fn2({foo: 'Quux', bar: {corge: 'Baz'}}); // Quux undefined Baz
3 - Desestructuración de objetos anidados con parámetros predeterminados profundosMe gustaría establecer los parámetros predeterminados en todos los niveles de la jerarquía de objetos para utilizar una especie de "desestructuración en cascada". Intenté esto, pero no funciona:
function fn3({foo = 'Foo', bar = ({quux = 'Quux', corge = 'Corge'} = {})} = {}) {
console.log(foo, bar.quux, bar.corge);
}
// Oops!
fn3(); // Foo undefined undefined
fn3({foo: 'Quux'}); // Quux undefined undefined
fn3({bar: {quux: 'Baz'}}); // Foo Baz undefined
fn3({foo: 'Quux', bar: {corge: 'Baz'}}); // Quux undefined Baz
¿Sabe si tal característica está permitida en ES6? En caso afirmativo, ¿cómo puedo implementarlo?