Nodejs TypeScript 如何获取 class 类的成员变量呢?

Nodejs TypeScript 如何获取 class 类的成员变量呢?

RT,求各位大佬解答下。 我有一个类:

class Test {
    id: Number
    name: String
}

想问下如何获取:["id", "name"] 谢谢!!!

16 回复

这样?
console.log(Test.id, Test.name)


不是,我想要动态获取。不是写死在代码中的

new Test().id ?

get getId()

如果使用 Object.getOwnPropertyNames(Test) 的话,返回了 [ ‘length’, ‘prototype’, ‘name’ ]
如果时候用 Object.getOwnPropertyNames(new Test()) 的话,返回了 []



不是写死代码的这种哈

那 object.keys 就行

keyof Test

我觉得得看你 tsconfig 怎么配置的,然后看看 class 被生成成什么样,才能想办法怎么拿

放弃吧,没有反射,有也要自己填值,如果你有这个心情手填反射的信息是可以的,我看过 angular 一些依赖注入和反射的实现原理。
源代码:
class Test {
id: number
name: string

constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
}
编译结果:
var Test = /** */ (function () {
function Test(id, name) {
this.id = id;
this.name = name;
}
return Test;
}());

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-reflectreflect-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-reflectreflect-metadata 等库。

回到顶部