如果配置对象不包含所有必需属性,则抛出错误

时间:2016-05-09 11:47:32

标签: javascript

我有一个需要配置对象的ES6类。 如果遗失了某个属性,我想抛出一个错误。

如果发现保持代码简短而不为每个属性添加if(!object.propN)...的解决方案是:

class myClass {
  constructor(config) {
    if (!config) {
      throw new Error("You must provide a config object");
    }

    this.prop1 = config.prop1;
    this.prop2 = config.prop2;
    this.prop3 = config.prop3;
    this.prop4 = config.prop4;

    for (const key in this) {
      if (!this[key]) {
        throw new Error(`Config object miss the property ${key}`);
      }
    }

  }
}

在javascript中执行此操作是否可以?

2 个答案:

答案 0 :(得分:1)

对于配置,我们通常使用功能Destructuring assignment通过使用ES6(ES2015)的糖来检查属性是否在对象中。

此外,我们还可以通过此功能为配置设置默认值。

{prop1, prop2, prop3: path='', prop4='helloworld', ...others} = config

在完成解构分配之后,只需要在我们要对特定配置做什么之前进行检查。即。

if (!prop1) {
  throw new Error(`Config object miss the property ${prop1}`);
}
doSomething(prop1);

但是如果你仍然想在开始时检查所有的配置,你可以做这样的事情,

class myClass {
  constructor(config) {
    if (!config) {
      throw new Error("You must provide a config object");
    }

    // You can assign the values to a new object like "tmpConfig" or just assign them back to "config" for the case config.propX === undefined
    ({prop1: config.prop1=undefined, prop2: config.prop2=undefined, prop3: config.prop3=undefined, prop4: config.prop4=undefined} = config);

    for (const key in config) {
      if (!config[key]) {
        throw new Error(`Config object miss the property ${key}`);
      }
    }

    Object.assign(this, config);
  }
}

或者仅通过设置默认值

来使用Object.assign()
class myClass {
  constructor(config) {
    if (!config) {
      throw new Error("You must provide a config object");
    }

    let requiredConfigs = {
      prop1: undefined,
      prop2: undefined,
      prop3: undefined,
      prop4: undefined,
    }
    let tmpConfig = Object.assign(requiredConfigs, config);

    for (const key in tmpConfig) {
      if (!tmpConfig[key]) {
        throw new Error(`Config object miss the property ${key}`);
      }
    }

    Object.assign(this, tmpConfig);
  }
}

=> 我们使用Destructuring assign和Object.assign()来进行设置配置。

答案 1 :(得分:0)

为避免将所有config属性过早和过度设置为this对象,您应事先检查空属性。
使用Array.some函数的解决方案:

class myClass {
  constructor(config) {
    if (!config || typeof config !== "object") {
        throw new Error("You must provide a config object!");
    } else if (Object.keys(config).some((k) => !config[k])) {  // returns 'true' if any empty property is found
        throw new Error(`Config object has empty property(ies)!`);
    }

    this.prop1 = config.prop1;
    this.prop2 = config.prop2;
    this.prop3 = config.prop3;
    this.prop4 = config.prop4;

  }
}