Nodejs TypeScript 如何获取 class 类的成员变量呢?
Nodejs TypeScript 如何获取 class 类的成员变量呢?
RT,求各位大佬解答下。 我有一个类:
class Test {
id: Number
name: String
}
想问下如何获取:["id", "name"] 谢谢!!!
不是,我想要动态获取。不是写死在代码中的
new Test().id ?
get getId()
如果使用 Object.getOwnPropertyNames(Test) 的话,返回了 [ ‘length’, ‘prototype’, ‘name’ ]
如果时候用 Object.getOwnPropertyNames(new Test()) 的话,返回了 []
不是写死代码的这种哈
那 object.keys 就行
keyof Test
我觉得得看你 tsconfig 怎么配置的,然后看看 class 被生成成什么样,才能想办法怎么拿
https://jkchao.github.io/typescript-book-chinese/tips/metadata.html
有兴趣的话,可以看看这个,angular 反射出注解的原理和这个差不多。
Object.getOwnPropertyNames(new Test())
另外 这个是能返回 [“id”, “name”] 的,虽然我不敢用这个。因为无关的东西也可能反射出来。
比如我有个 private 变量,也会被这个取出来。所以这个并不是很实用。
Object.keys(Test.prototype)
reflect-metadata
了解一下?
在 Node.js 中使用 TypeScript,你可以通过反射机制来获取一个类的成员变量。TypeScript 编译后的代码仍然保留了 JavaScript 的元信息,因此可以利用 Reflect
API 和一些类型工具库(如 ts-reflect
或 reflect-metadata
)来实现这一点。不过,TypeScript 本身并不直接提供在运行时获取类成员变量的内置功能,因此通常需要借助第三方库或手动实现。
下面是一个简单的方法,通过 TypeScript 的装饰器和 Reflect.ownKeys
来获取类的成员变量:
function logMembers(target: any) {
const members = Reflect.ownKeys(target.prototype).filter(key => !['constructor', 'toString', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'valueOf', 'symbolToStringTag'].includes(key));
console.log('Class members:', members);
}
@logMembers
class MyClass {
public prop1: string;
private prop2: number;
constructor() {
this.prop1 = 'Hello';
this.prop2 = 123;
}
}
// 创建类的实例以触发装饰器
new MyClass();
在这个例子中,logMembers
装饰器会在类定义时被调用,并使用 Reflect.ownKeys
获取类的所有属性(包括私有和公共属性),然后过滤掉一些 JavaScript 默认的属性。注意,装饰器是 TypeScript 的实验性功能,需要在 tsconfig.json
中启用 "experimentalDecorators": true
。
这种方法虽然简单,但可能不适用于所有场景,特别是当需要更复杂的反射功能时。对于更复杂的需求,可以考虑使用 ts-reflect
或 reflect-metadata
等库。