如何避免多个if语句检查typescript中的属性是否为null

时间:2018-03-22 14:42:36

标签: angular typescript

我很好奇是否有更好的方法或方法来编写以下代码。

    private buildQueryParams(filterData: BaseFilterModel | RegistrationFilterModel): HttpParams {
    let params = new HttpParams();
    if (filterData) {
      if (filterData.regionId) {
        params = params.set('regionId', filterData.regionId.toString());
      }
      if (filterData.facilityId) {
        params = params.set('facilityId', filterData.facilityId.toString());
      }
      if (filterData.dept1 && filterData.dept1.id) {
        params = params.set('dept1', filterData.dept1.id.toString());
      }
      if (filterData.dept2 && filterData.dept2.id) {
        params = params.set('dept2', filterData.dept2.id.toString());
      }
      if (filterData.role && filterData.role !== 'All') {
        params = params.set('role', filterData.role);
      }
      if ((<RegistrationFilterModel>filterData).registrationDate) {
        params = params.set('registrationDate', (<RegistrationFilterModel>filterData).registrationDate.toString());
      }
      if ((<RegistrationFilterModel>filterData).activeStatus
        && (<RegistrationFilterModel>filterData).activeStatus !== ActiveStatus.All) {
        params = params.set('activeStatus', (<RegistrationFilterModel>filterData).activeStatus.toString());
      }
    }

    return params;
  }

这基本上是基于具有这些设置值的对象(filterData)为http请求创建参数。我们将这个对象用于具有相似但略有不同的参数的多个端点,因此它遍历每个if语句以确保regionId,facilityId等。不是空的。

有没有更好的方法来实现这一点,而不是如果我们添加更多参数,可以获得更大和更大的if语句列表。

5 个答案:

答案 0 :(得分:1)

您可以使用以下内容减少一些行:

 var fields = ['regionId','facilityId','dept1','dept2'];
  for (let field of fields) {
    if (filterData[field]){
        params = params.set(field, filterData[field].toString());
    }
  }

或用战略模式的具体战略管理每个案例。

答案 1 :(得分:1)

您可以使用测试来定义本地函数以执行实际设置,以避免null或undefined(或空字符串)并在需要时转换为字符串。类似的东西:

private buildQueryParams(filterData: BaseFilterModel | RegistrationFilterModel): HttpParams {
 let params = new HttpParams();
 function setparam(name: string, value: number|string) {
   if (value) params = params.set(name, value.toString());
 }

 if (filterData) {
     setparam('regionId', filterData.regionId);
     setparam('facilityId', filterData.facilityId);
     setparam('dept1',  filterData.dept1 && filterData.dept1.id);
     setparam('dept2', filterData.dept2 && filterData.dept2.id);
     if (filterData.role != 'All') {
       setparam('role', filterData.role);
     }
     setparam('registrationDate', (<RegistrationFilterModel>filterData).registrationDate);
     if ((<RegistrationFilterModel>filterData).activeStatus !== ActiveStatus.All) {
       setparam('activeStatus', (<RegistrationFilterModel>filterData).activeStatus);
     }
 }

 return params;
}

value的实际类型应与预期类型匹配,甚至可以是any

答案 2 :(得分:0)

  

Lodash是要走的路:

var object = {
  'a': [{
    'b': {
      'c': 100
    },
    'd': 'MARKS'
  }]
};

console.log(_.get(object, ['a', '0', 'b', 'c']));
console.log(_.get(object, ['a', '0', 'd']).toLowerCase());    // Do operation on the object found
console.log(_.get(object, ['a', '0', 'foo'], 'granted'));     // Specify default value, if incorrect path
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

  

看一下文档:

Lodash Get

  

解释

  1. 它处理多个if if的情况,如果没有找到,则返回默认值
  2. 您可以使用返回值执行任何操作,将其降低或更高,或转换为字符串
  3. lodash有多种语法可供使用,请查看文档

答案 3 :(得分:0)

更多面向对象的方式就是做这样的事情。

enum ActiveStatus {
  ALL
}

class Department {
  constructor(private _id: number){}
  public toString() {
    return this._id.toString();
  }
}

class Role {
  private _name: "ALL";

  public toString() {
    return this._name == "ALL" ? "" : this._name;
  }
}

class FilterData {

  constructor(
    private _regionId: number,
    private _facilityId: number,
    private _dep1: Department,
    private _dep2: Department,
    private _activeStatus: ActiveStatus
  ) {

  }

  public toHttpParams() {
    let params = new HttpParams();
    Object.keys(this).forEach((key) => {
      let value = this[key].toString();
      value && params.set(key.slice(1), value);
    });
    return params;
  }
}

let filterData = new FilterData(
  1,
  2,
  new Department(5),
  new Department(7),
  ActiveStatus.ALL
);

console.log(filterData.toHttpParams());

答案 4 :(得分:0)

您可以使用可选的链接运算符

let x = foo?.bar.baz();

和Nullish合并运算符 ??

让x = foo ?? bar();

Doc Link