如何指定一个const对象用作模板

时间:2016-08-29 13:55:34

标签: angular typescript

我正在构建elasticsearch查询,并希望在发送到我的数据服务之前使用对象模板构建查询的POST主体。

第一次查询构建很好,但是,当我使用模板时,我声明的实际const对象被更改,之后模板被破坏。在下面的代码中,不仅retunQuery值发生了变化,而且INIT_QUERY const的值也发生了相同的变化。如何使用此const对象作为模板,而不实际更改它的值。

const INIT_QUERY = {
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": <any>[]
                }
            }
        }
    }
}

const MATCH_QUERY = {
    "match": <any>{}
}
...

export class QueryBuilder {

 constructor() {}

 buildQuery() {
   let returnQuery = INIT_QUERY;
   .... loop

     let query = MATCH_QUERY;
     query.match[dbfield].query = 'fieldValueToSearch';

     returnQuery.query.filtered.filter.bool.must.push(query);

   .... end loop

   return returnQuery;
 }

}

1 个答案:

答案 0 :(得分:1)

let returnQuery = INIT_QUERY;只是创建了对INIT_QUERY的另一个引用。两者都指向同一个对象。

Object.assign({}, INIT_QUERY);只会创建一个浅拷贝,所以这还不够。

我看到的最简单的方法是将您的“模板”作为JSON提供,并从中创建新对象。

这会打破intellisense。您需要创建一个接口并进行类型转换。

interface Query {
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": any[]
        }
      }
    }
  }
}
const INIT_QUERY = `{
  "query": {
    "filtered": {
        "filter": {
            "bool": {
                "must": []
            }
        }
    }
}`;
let query: Query = <Query>JSON.parse(INIT_QUERY);