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))
...
}
}