我有:
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的对象,它将不会在循环中迭代。有没有办法在这里使用静态反射检查所有键,即使它们没有定义?
如果对象上不存在属性,则无法迭代它们。实际上,它们不是属性。
应该存在于对象上的属性应添加到列表中:
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))
...
}
}