gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:32 25 4
gpt4 key购买 nike

我有:

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”属性的对象,它就不会在循环中迭代。有没有办法在这里使用静态反射来检查所有键,即使它们没有定义?

最佳答案

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

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

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 返回自己的可枚举键,这可能无法在依赖原型(prototype)链的复杂对象上按预期工作,但可以在普通对象上工作。

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

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

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

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

关于javascript - 如何在 Typescript 中使用反射获取所有属性(包括未定义的)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48076185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com