如何列出给定对象的所有获取属性?

How can I list all the get properties from a give object?

给出 class:

export class Foo
{
    #x: number;
    #y : number;

    constructor()
    {
        this.#x = 20;
        this.#y = 10;
    }

    public get a(): string { return "baa"; }
    public get n(): number { return 20; }
}

如何获取 getter 属性,即 ["a", "n"]?我还没有要显示的代码,我已经查看了 reflect and reflect-metadata,但找不到任何内容来列出这些代码。我正在使用打字稿,但也欢迎 javascript 解决方案。

您可以遍历原型(或对象及其每个原型)的 属性 描述符,并查看描述符是否具有 get 函数。

const logGetters = obj => {
  if (!obj) return;
  for (const [key, desc] of Object.entries(Object.getOwnPropertyDescriptors(obj))) {
    if (desc.get && key !== '__proto__') console.log(key); // exclude Object.prototype getter
  }
  logGetters(Object.getPrototypeOf(obj));
};

class Foo {
  #x;
  #y;
  constructor() {
    this.#x = 20;
    this.#y = 10;
  }

  get a() {
    return "baa";
  }
  get n() {
    return 20;
  }
}

const f = new Foo();
logGetters(f);

对于 Typescript,只需使用 const logGetters = (obj: object) => { 进行注释。

您可以 filter 超过 Object.getOwnPropertyDescriptors

class Foo
{
    #x;
    #y;

    constructor()
    {
        this.#x = 20;
        this.#y = 10;
    }

     get a()  { return "baa"; }
     get n()  { return 20; }
}
const res = Object.entries(Object.getOwnPropertyDescriptors(Foo.prototype))
  .filter(([k, d])=>typeof d.get === 'function').map(([k])=>k);
console.log(res);