检索Typescript类属性

时间:2018-03-23 17:27:15

标签: typescript reflection

如果你有一个班级

export class Address {
  id: number;
  addrLine1: string;
  addrLine2: string;
  ...
}

创建对象后

const address = new Address();

您可以通过向Address

添加另一个属性来跳过TypeScript编译器
address['addrLine3'] = 'some value';

我想只保留对象中Address类的一部分键(在实例化之后的时间)。

意思是,我想从addrLine3对象中删除address密钥。

如果我们能够反思地列出班级Address的所有字段,但这似乎不可能,或者是吗?

我们可以这样做

或者,还有其他办法吗?

一种方法是使用所需的键创建一个Address类的对象并与该对象进行比较,但这不是最好的方法!

2 个答案:

答案 0 :(得分:0)

您不需要针对这种特殊情况进行反思 - 您只需要一个新的干净地址对象,它不会有任何顽皮的附加属性。

class Address {
  id: number = 0;
  addrLine1: string = '';
  addrLine2: string = '';
}

const addr1 = new Address();
addr1.addrLine1 = 'One';
addr1.addrLine2 = 'Two';
addr1['addrLine3'] = 'Line Three!';

function getCleanAddress(address: Address): Address {
    const cleanAddress = new Address();
    for (const prop in cleanAddress) {
        cleanAddress[prop] = address[prop];
    }
    return cleanAddress;
}

const addr2 = getCleanAddress(addr1);

// Object { id: 0, addrLine1: "One", addrLine2: "Two", addrLine3: "Line Three!" }
console.log(addr1);

// Object { id: 0, addrLine1: "One", addrLine2: "Two" }
console.log(addr2);

警告......您需要确保空实例上的所有属性都有值,否则TypeScript编译器会优化它们。

答案 1 :(得分:0)

以下是如何使用数组生成动态行数的示例, 但您可以考虑将线存储到地图中。

class AddressExample {

  constructor(
    private _id: number,
    private _lines: string[]
  ){

  }

  public addLine(line:string){
    this._lines.push(line);
  }

  public removeLastLine(){
    this._lines.pop();
  }

  public removeLine(index:number){
    this._lines.splice(index, 1);
  }

  public toNeededFormat(){
    let result = {
      id: this._id,
    };

    this._lines.forEach((line: string, index:number) => {
      result['addrLine'+index] = line;
    });

    return result;
  }
}