如何使用Typescript中的反射获取所有属性(包括undefined)?

问题描述 投票:2回答:1

我有:

let requiredSymbobl = Symbol('required');
let function required() { return Reflect.metadata(requiredSymbol, null); }

class Person {
  @required();
  name: string;
}


let p = new Person(); //In reality comes from POST data

//Validate every key with required meta data.
for(let key in p) {
  if(typeof Reflect.getMetadata(requiredSymbol, p, key) !== 'undefined') {
    //Validate 
  }
}

问题是如果客户端没有POST一个定义了'name'property的对象,它将不会在循环中迭代。有没有办法在这里使用静态反射检查所有键,即使它们没有定义?

javascript typescript reflection ecmascript-6
1个回答
1
投票

如果对象上不存在属性,则无法迭代它们。实际上,它们不是属性。

应该存在于对象上的属性应添加到列表中:

for (const key of Array.from(new Set([...Object.keys(p), 'name'])))
  ...

或者对于启用了下层迭代器的TypeScript:

for (const key of new Set([...Object.keys(p), 'name']))
  ...

由于Object.keys返回自己的可枚举键,因此在依赖原型链但可以在普通对象上工作的复杂对象上,这可能无法正常工作。

另一种方法是让类接受构造函数中所需的所有属性。该类还可以负责其验证:

class Person {
  @required();
  name: string;

  constructor(plainObj) {
    this.name = plainObj.name;
    ...
  }

  validate() {
    // only enumerable instance props
    for (const key of Object.keys(this))
      ...
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.