ES6对象解构强制参数

时间:2017-01-08 18:16:26

标签: javascript ecmascript-6

以下是该功能,password是强制性的,但其他idname具有默认值:

function name({id = null, name = 'user', password}) { }

结果:

name();     //throws error as expected
name({});   //passes 'password' as 'undefined' - should've thrown error

如果使用ES6功能未提供password,如何使此功能抛出错误?

4 个答案:

答案 0 :(得分:4)

您可以分配相同的变量,如果没有给出,则会抛出错误Use before declaration

function name({ id = null, name = 'user', password = password }) {
    console.log(password);
}
name({});

如果设置,那么它可以正常工作。

function name({ id = null, name = 'user', password = password }) {
    console.log(password);
}
name({ password: 'foo' });

答案 1 :(得分:2)

您没有要求它,您根本没有提供默认值。

function name({id = null, name = 'user', password}) {
     if (password == undefined) {
        throw new Error('password is required');
    }

它第一次抛出错误的原因是因为它试图破坏undefined,这是不可能的。

答案 2 :(得分:2)

注意:这是一个使用默认参数的丑陋黑客,我更喜欢@Scimonster's answer

您实际上可以运行一个函数,甚至可以将IIFE作为默认参数。 IIFE可能会抛出错误:



function name({
  id = null, 
  name = 'user',
  password = (() => { throw new Error('password not defined'); })()
}) { 
  console.log(id, name, password);
}
  
name({ id: 1, name: 'the name', password: 'the password' }); // works

name({}); // throws an error




答案 3 :(得分:1)

关于问题是什么,

Scimonster's answer是正确的。

如果您愿意,可以使用实用程序函数在函数参数列表中抛出Error,以声明方式处理它:

// Utility function:
function throwRequired(name) {
  throw new Error(`'${name}' is required`);
}

function name({id = null, name = 'user', password = throwRequired("password")}) {
  console.log("All is good, password is: " + password);
}

try {
  name();     //throws error as expected
} catch (e) {
  console.log("Got error from name():", e.message);
}
try {
  name({});     //throws error as expected
} catch (e) {
  console.log("Got error from name({}):", e.message);
}
name({password: "foo"}); // works

这是有效的,因为只有在需要填写默认参数时,才会评估默认参数的初始值设定项。