Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Typescript中的反射获取所有属性(包括未定义的属性)?_Javascript_Typescript_Reflection_Ecmascript 6 - Fatal编程技术网

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

Javascript 如何使用Typescript中的反射获取所有属性(包括未定义的属性)?,javascript,typescript,reflection,ecmascript-6,Javascript,Typescript,Reflection,Ecmascript 6,我有: 问题是,如果客户机没有发布定义了“name”属性的对象,它将不会在循环中迭代。有没有一种方法可以在这里使用静态反射来检查所有键,即使它们没有定义?如果对象上不存在属性,则无法对它们进行迭代。事实上,它们不是财产 应该将对象上应该存在的属性添加到列表中: let requiredSymbobl = Symbol('required'); let function required() { return Reflect.metadata(requiredSymbol, null); } c

我有:


问题是,如果客户机没有发布定义了“name”属性的对象,它将不会在循环中迭代。有没有一种方法可以在这里使用静态反射来检查所有键,即使它们没有定义?

如果对象上不存在属性,则无法对它们进行迭代。事实上,它们不是财产

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

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 
  }
}
或对于启用了下层迭代器的TypeScript:

for (const key of Array.from(new Set([...Object.keys(p), 'name'])))
  ...
由于
Object.keys
返回自己的可枚举键,这在依赖原型链的复杂对象上可能不会像预期的那样起作用,但在普通对象上会起作用

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

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

请不要使用过多的格式。我应该澄清一下,不要寻找在类声明中定义值的解决方案。在您的前两个代码段中,“required”是指“email”吗?为了清晰起见,我将其更改为
name
,正如原始代码所示。哇,对不起,叶,这就是我的意思-哈哈。干杯
class Person {
  @required();
  name: string;

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

  validate() {
    // only enumerable instance props
    for (const key of Object.keys(this))
      ...
  }
}